class SyntaxObj(object):
pass
class EvalObj(SyntaxObj):
def __str__(self):
return "#<Object>"
class ValObj(EvalObj):
def __str__(self):
return "#<Value>"
class NumberObj(ValObj):
def __str__(selfl):
return "#<Number>"
class IntObj(NumberObj):
def __init__(self, num):
self.val = int(num)
def __str__(self):
return "#<Integer>"
class FloatObj(NumberObj):
def __init__(self, num):
self.val = float(num)
def __str__(self):
return "#<Float>"
class StringObj(ValObj):
def __init__(self, string):
self.val = string
def __str__(self):
return "#<String>"
class BoolObj(ValObj):
def __init__(self, b):
self.val = b
def __str__(self):
return "#<Boolean>"
class OptObj(EvalObj):
pass
class ProcObj(OptObj):
def __init__(self, prog, env = None):
self.prog = prog
self.env = env
def __str__(self):
return "#<Procedure>"
class SpecialOptObj(OptObj):
def prepare(self, pc):
pass
def call(self, arg_list, pc, envt, cont):
pass
class BuiltinProcObj():
def __init__(self, f, ext_name):
self.handler = f
self.ext_name = ext_name
def __str__(self):
return self.ext_name
def call(self, arg_list):
return self.handler(arg_list)
def to_bool(obj):
if obj.val == False:
return BoolObj(False)
else:
return BoolObj(True)
class _builtin_if(SpecialOptObj):
def prepare(self, pc):
self.state = 0 # prepare
# TODO: check number of arguments
return (True, False, False)
# Delay the calculation
def pre_call(self, arg_list, pc, envt, cont):
self.state = 1 # calling
print "Received if signal: " + str(arg_list[0].val)
print "And it is regared as: " + str(to_bool(arg_list[0]).val)
if (to_bool(arg_list[0])).val:
return ((False, True, False), True) # Re-eval
else:
return ((False, False, True), True) # Re-eval
def post_call(self, arg_list, pc, envt, cont):
return (arg_list[0], False)
def call(self, arg_list, pc, envt, cont):
if self.state == 0:
return self.pre_call(arg_list, pc, envt, cont)
else:
return self.post_call(arg_list, pc, envt, cont)
def __str__(self):
return "#<builtint opt if>"
class _builtin_lambda(SpecialOptObj):
def prepare(self, pc):
# TODO: check number of arguments
return [ False, False ]
class IdObj(SyntaxObj):
def __init__(self, string):
self.name = string
def __str__(self):
return "#<Identifier>"
def get_name():
return self.name
class Tokenizor():
def __init__(self):
self.data = ""
self.tokenized = list()
self.extended_chars = "!$%&*+-./:<=>?@^_~"
def is_identifier(self, string):
if string[0].isdigit(): return False
for i in string[1:]:
if not (i<