예제 #1
0
 def quasiquote(self, compiler, cont):
   result = compiler.new_var(il.LocalVar('result'))
   vars = tuple(compiler.new_var(il.ConstLocalVar('a'+repr(i))) for i in range(len(self.args)))
   body = (il.Assign(result, il.empty_list),)+tuple(
     il.If(il.Isinstance(var, il.Klass('UnquoteSplice')),
                 il.AddAssign(result, il.Call(il.Symbol('list'), il.Attr(var, il.Symbol('item')))),
                 il.ListAppend(result, var),
                 ) for var in vars)+(
     cont(il.Call(il.Klass(self.__class__.__name__), il.QuoteItem(self.function), il.MakeTuple(result))),)
   fun = il.begin(*body)
   for var, arg in reversed(zip(vars, self.args)):
     fun = arg.quasiquote(compiler, il.clamda(var, fun))
   return fun
예제 #2
0
파일: terminal.py 프로젝트: hermetique/dao
def char(compiler, cont, argument):
  text = compiler.new_var(il.ConstLocalVar('text'))
  pos = compiler.new_var(il.ConstLocalVar('pos'))
  if isinstance(argument, String):
    argument = argument.interlang()
    return il.Begin((
      il.AssignFromList(text, pos, il.parse_state),
      il.If(il.Ge(pos, il.Len(text)), 
        il.failcont(il.NONE),
        il.If(il.Eq(argument, il.GetItem(text, pos)),
              il.begin(il.append_failcont(compiler, 
                              il.SetParseState(il.Tuple(text, pos))),
                       il.SetParseState(il.Tuple(text, il.add(pos, il.Integer(1)))),
                       cont(il.GetItem(text, pos))),
              il.failcont(il.NONE)))))
  
  elif isinstance(argument, Var):
    v = compiler.new_var(il.ConstLocalVar('v'))
    argument = argument.interlang()
    argument1 = compiler.new_var(il.ConstLocalVar('argument'))
    return il.Begin((
      il.AssignFromList(text, pos, il.parse_state),
      il.If(il.Ge(pos,il.Len(text)), 
        il.failcont(il.FALSE),
        il.Begin((
          il.Assign(argument1, il.Deref(argument)),
          #il.Prin(text), il.Prin(pos), il.PrintLn(argument1),
          il.If(il.Isinstance(argument1, il.Symbol('str')),
            il.If(il.Eq(argument1, il.GetItem(text, pos)),
                  il.begin(il.append_failcont(compiler, 
                                  il.SetParseState(il.Tuple(text, pos))),
                           il.SetParseState(il.Tuple(text, il.add(pos, il.Integer(1)))),
                           cont(il.GetItem(text, pos))),
                  il.failcont(il.NONE)),
            il.If(il.IsLogicVar(argument1),
                  il.begin(il.SetParseState(il.Tuple(text, il.add(pos, il.Integer(1)))),
                           il.SetBinding(argument1, il.GetItem(text, pos)),
                           il.append_failcont(compiler, 
                              il.SetParseState(il.Tuple(text, pos)),
                              il.DelBinding(argument1)),
                           cont(il.GetItem(text, pos))),
                  il.RaiseTypeError(argument1))))))))
      
  # elif isinstance(argument, il.LogicVar) #how about this? It should be include above.
  else: raise CompileTypeError(argument)
예제 #3
0
 def interlang(self):
   return il.Symbol(self.item)
예제 #4
0
def isstr(compiler, cont, item):
    return cont(il.Isinstance(item.interlang(), il.Symbol('str')))
예제 #5
0
def isnumber(compiler, cont, item):
    return cont(
        il.or_(il.Isinstance(item.interlang(), il.Symbol('int')),
               il.Isinstance(item.interlang(), il.Symbol('float'))))
예제 #6
0
def isfloat(compiler, cont, item):
    return cont(il.Isinstance(item.interlang(), il.Symbol('float')))
예제 #7
0
def istuple(compiler, cont, item):
    return cont(il.Isinstance(item.interlang(), il.Symbol('tuple')))