Esempio n. 1
0
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)
Esempio n. 2
0
 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
Esempio n. 3
0
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
Esempio n. 4
0
 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
Esempio n. 5
0
 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))
Esempio n. 6
0
    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
Esempio n. 7
0
    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
Esempio n. 8
0
 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)