docs: def word(compiler, cont, arg):
    'word of letters'
    text = compiler.new_var(il.ConstLocalVar('text'))
    pos = compiler.new_var(il.ConstLocalVar('pos'))
    p = compiler.new_var(il.LocalVar('p'))
    length = compiler.new_var(il.ConstLocalVar('length'))
    if isinstance(arg, Var):
      arg = arg.interlang()
      x = compiler.new_var(il.ConstLocalVar('x'))
      return il.Begin((
        il.AssignFromList(text, pos, il.parse_state),
        il.Assign(length, il.Len(text)),
        il.If(il.Ge(pos, length),
          il.failcont(il.FALSE),
            il.If(il.And(il.Not(il.Cle(il.String('a'), il.GetItem(text, pos), il.String('z'))), 
                         il.Not(il.Cle(il.String('A'), il.GetItem(text, pos), il.String('Z')))), 
              il.failcont(il.FALSE),
              il.Begin((
                il.Assign(p, il.add(pos, il.Integer(1))),
                il.while_(il.And(il.Lt(p, length), 
                                il.Or(il.Cle(il.String('a'), il.GetItem(text, p), il.String('z')), 
                                      il.Cle(il.String('A'),il.GetItem(text, p),il.String('Z')))), 
                         il.AddAssign(p, il.Integer(1))),
                il.Assign(x, il.Deref(arg)),
                il.If(il.IsLogicVar(x),
                      il.begin(il.SetParseState(il.Tuple(text, p)),
                                     il.SetBinding(x, il.GetItem(text, il.Slice2(pos, p))),
                                     il.append_failcont(compiler, 
                                        il.SetParseState(il.Tuple(text, pos)),
                                        il.DelBinding(x)),
                                     cont(il.GetItem(text, pos))),
                      il.If(il.Isinstance(x, il.String('str')),
                            il.If(il.Eq(x, il.GetItem(text, il.Slice2(pos, p))),
                                  il.begin(il.append_failcont(compiler, 
                                    il.SetParseState(il.Tuple(text, pos))),
                                    il.SetParseState(il.Tuple(text, p)),
                                    cont(il.GetItem(text, pos))),
                                  il.failcont(il.NONE)),
                            il.RaiseTypeError(x)))))))))
    elif isinstance(arg, String):
      arg = arg.interlang()
      return il.Begin((
        il.AssignFromList(text, pos, il.parse_state),
        il.Assign(length, il.Len(text)),
        il.If(il.Ge(pos, length), 
          il.failcont(il.FALSE),
          il.If(il.And(il.Not(il.Cle(il.String('a'), il.GetItem(text, pos), il.String('z'))), 
                       il.Not(il.Cle(il.String('A'), il.GetItem(text, pos), il.String('Z')))), 
            il.failcont(il.FALSE),
          il.Begin((
            il.Assign(p, il.add(pos, il.Integer(1))),
            il.while_(il.And(il.Lt(p, length), 
                            il.Or(il.Cle(il.String('a'), il.GetItem(text, p), il.String('z')), 
                                  il.Cle(il.String('A'),il.GetItem(text, p), il.String('Z')))), 
                    il.AddAssign(p, il.Integer(1))),
            il.If(il.Eq(arg, il.GetItem(text, il.Slice2(pos, p))),
                  il.begin(il.append_failcont(compiler, 
                    il.SetParseState(il.Tuple(text, pos))),
                    il.SetParseState(il.Tuple(text, p)),
                    cont(arg)),
                  il.failcont(il.NONE))))))))
    else:
      raise CompileTypeError