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