def add_standard_functions(env): functions = """ (define (1+ x) (+ x 1)) (define (1- x) (- x 1)) (define (list . x) x) (define (cadr x) (car (cdr x))) (define (cdar x) (cdr (car x))) (define (caar x) (car (car x))) (define (cddr x) (cdr (cdr x))) (define (map f args) (if (null? args) '() (cons (f (car args)) (map f (cdr args))))) (define (filter f args) (if (null? args) '() (if (f (car args)) (cons (car args) (filter f (cdr args))) (filter f (cdr args))))) (define-macro (let let-args . let-body) `((lambda ,(map car let-args) ,@let-body) ,@(map cadr let-args))) """ for exp in analyzer.get_sexps(functions): evals(exp, env)
def expand(x): if isa(x, Cell): if x.car == "unquote": return evals(x.cdr.car, env) elif isa(x.car, Cell) and x.car.car == "unquote-splicing": return connect(evals(x.car.cdr.car, env), expand(x.cdr)) else: return Cell(expand(x.car), expand(x.cdr)) else: return x
def run_repl(): print "////////////////////////////////////////////////////////////" print "// アメージング☆エターナルフォースブリザード☆わざびずLisp //" print "//////////////////// Powered by wasabi /////////////////////" print "////////////////////////////////////////////////////////////" print 'Type "(quit)" or "(exit)" to exit interactive mode' print global_env = Env() add_global_functions(global_env) while True: s = raw_input("NLisp >> ") try: for exp in analyzer.get_sexps(s): result = evals(exp, global_env) if result: print result except SystemExit: sys.exit(0) except SyntaxError: print "Syntax Error!" except: print "Rumtime Error!" print "-" * 30 traceback.print_exc(file=sys.stdout) print "-" * 30
def begin_syntax(arg, env): inner = Env(env) exp = arg val = undef while not exp == nil: val = evals(exp.car, inner) exp = exp.cdr return val
def setq_syntax(arg, env): var = arg.car exp = arg.cdr.car if var in env: env[var] = evals(exp, env) return env[var] else: raise Exception("Symbol:{0} is not binded before".format(var))
def define_syntax(arg, env): var = arg.car exp = arg.cdr.car if isa(var, Cell): name = var.car pars = var.cdr env[name] = Closure(exp, pars, env) else: name = var env[name] = evals(exp, env) return name
def define_macro_syntax(arg, env): var = arg.car exp = arg.cdr.car if isa(var, Cell): name = var.car pars = var.cdr proc = Closure(exp, pars, env) env[name] = Macro(proc) else: name = var env[name] = Macro(evals(exp, env)) return undef
def if_syntax(arg, env): if evals(arg.car, env) == t: return evals(arg.cdr.car, env) elif not arg.cdr.cdr == nil: return evals(arg.cdr.cdr.car, env)