def eval(self, t, env):
     #if variable definition
     if t.getCdr().getCar().isSymbol():
         env.define(
             t.getCdr().getCar(),
             Cons(t.getCdr().getCdr().getCar().eval(env),
                  Nil.getInstance()))
     #If definition is for a closure
     elif t.getCdr().getCar().isPair():
         env.define(t.getCdr().getCar().getCar(),
                    Cons(Closure(t.getCdr(), env), Nil.getInstance()))
     return Nil.getInstance()
Beispiel #2
0
 def eval(self, exp, env):
     key = exp.getCdr().getCar()
     val = exp.getCdr().getCdr().getCar()
     # if defining a variable
     if key.isSymbol():
         env.define(key, val)
     # if defining a function
     else:
         func = Closure(
             Cons(exp.getCdr().getCar().getCdr(),
                  exp.getCdr().getCdr()), env)
         env.define(key.getCar(), func)
     return StrLit("no values returned")
 def eval(self, exp, env):
      return Closure(exp.getCdr(), env, trimmed=True)
 def eval(self, exp, env):
     return Closure(exp, env)
from Special import Special
from Util import Util

if __name__ == "__main__":
    # Initialization file with Scheme definitions of built-in functions
    ini_file = "ini.scm"

    prompt = "> "

    # Create scanner that reads from standard input
    scanner = Scanner(sys.stdin)

    util = Util()
    Cons.setUtil(util)
    BuiltIn.setUtil(util)
    Closure.setUtil(util)
    Special.setUtil(util)

    if (len(sys.argv) > 2 or (len(sys.argv) == 2 and sys.argv[1] != "-d")):
        sys.stderr.write("Usage: python3 SPP.py [-d]\n")
        sys.stderr.flush()
        sys.exit(2)

    # If command line option -d is provided, debug the scanner.
    if len(sys.argv) == 2 and sys.argv[1] == "-d":
        tok = scanner.getNextToken()
        while tok != None:
            tt = tok.getType()

            sys.stdout.write(str(tt))
            if tt == TokenType.INT: