def string_on_predicate0(compiler, cont, test):
  '''return current char and step if @test succeed, where 
   @test: a python function with one argument, which tests on one char and return True or False
          @test must be registered with register_function'''
  test = test.interlang()
  text = compiler.new_var(il.ConstLocalVar('text'))
  pos = compiler.new_var(il.ConstLocalVar('pos'))
  length = compiler.new_var(il.ConstLocalVar('length'))
  p = compiler.new_var(il.LocalVar('p'))
  if not isinstance(test, il.PyFunction):
    raise DaoCompileTypeError(test)
  return il.Begin((
    il.AssignFromList(text, pos, il.parse_state),
    il.Assign(length, il.Len(text)),
    il.If(il.Ge(pos,il.Len(text)), 
      cont(il.String('')),
      il.begin(
        il.Assign(p, pos),
        il.While(il.And(il.Lt(p, length), il.Call(test, il.GetItem(text, p))),
               il.AddAssign(p, il.Integer(1))),
        il.SetParseState(il.Tuple(text, p)),
        il.append_failcont(compiler, 
                           il.SetParseState(il.Tuple(text, pos))),
        cont(il.GetItem(text, il.Slice2(pos, p)))))))
def string_on_predicate0 ( compiler , cont , test ) : test = test . interlang ( ) text = compiler . new_var ( il . ConstLocalVar ( 'text' ) ) pos = compiler . new_var ( il . ConstLocalVar ( 'pos' ) ) length = compiler . new_var ( il . ConstLocalVar ( 'length' ) ) p = compiler . new_var ( il . LocalVar ( 'p' ) ) if not isinstance ( test , il . PyFunction ) : raise DaoCompileTypeError ( test ) return il . Begin ( ( il . AssignFromList ( text , pos , il . parse_state ) , il . Assign ( length , il . Len ( text ) ) , il . If ( il . Ge ( pos , il . Len ( text ) ) , cont ( il . String ( '' ) ) , il . begin ( il . Assign ( p , pos ) , il . While ( il . And ( il . Lt ( p , length ) , il . Call ( test , il . GetItem ( text , p ) ) ) , il . AddAssign ( p , il . Integer ( 1 ) ) ) , il . SetParseState ( il . Tuple ( text , p ) ) , il . append_failcont ( compiler , il . SetParseState ( il . Tuple ( text , pos ) ) ) , cont ( il . GetItem ( text , il . Slice2 ( pos , p ) ) ) ) ) ) )
return current char and step if @test succeed, where 
   @test: a python function with one argument, which tests on one char and return True or False
          @test must be registered with register_function