Пример #1
0
 public override Node eval(Node t, Environment env)
 {
     //arg1: set!
     //arg2: variable
     //arg3: value
     env.assign(t.getCdr().getCar(), t.getCdr().getCdr().getCar().eval(env));
     return new StringLit("set done");
 }
Пример #2
0
        public override Node eval(Environment env, Node args)
        {
            Node expr1 = args.getCar();

            if (args.getCdr().isNull() == true)
            {
                return(new StringLit("Error: Only 1 argument passed to 'set!.'"));
            }
            else if (args.getCdr().getCdr().isNull() == false)
            {
                return(new StringLit("Error: Too many arguments passed to 'set!.'"));
            }
            // Is this defining a function?
            else if (expr1.isPair() == true)
            {
                if (expr1.getCar().isSymbol() == true)
                {
                    // Construct the lambda expression
                    Node formalsAndBody = new Cons(expr1.getCdr(), args.getCdr());
                    Node lambdaExpr     = new Cons(new Ident("lambda"), formalsAndBody);
                    // set!.apply()
                    return(env.assign(expr1.getCar(), lambdaExpr.eval(env)));
                }
                else
                {
                    return(new StringLit("Error: First argument to 'set!' must be a <variable>"));
                }
            }
            else
            {
                if (expr1.isSymbol() == true)
                {
                    // set!.apply()
                    return(env.assign(expr1, args.getCdr().getCar().eval(env)));
                }
                else
                {
                    return(new StringLit("Error: First argument to 'set!' must be a <variable>"));
                }
            }
        }
Пример #3
0
        public override Node eval(Node exp, Environment env)
        {
            if (Node.length(exp) != 3)
            {
                Console.Error.WriteLine("Error: invalid set expression");
                return((Node)Nil.getInstance());
            }
            Node var    = exp.getCdr().getCar();
            Node varExp = exp.getCdr().getCdr().getCar();

            env.assign(var, varExp.eval(env));
            return(Unspecific.getInstance());
        }
Пример #4
0
 public Node eval(Node t, Environment e)
 {
     Node current = t.getCdr().getCar();
     if (!current.isSymbol())
     {
         Console.Error.WriteLine("Error: Not an identifier");
         return Nil.getInstance();
     }
     // insert some methods about env, kinda confusing/binding stuff
     Node final = t.getCdr().getCdr().getCar();
     final = final.eval(final, e);
     e.assign(current, final);
     return new StringLit("; " + current.getName() + " - updated.");
 }
Пример #5
0
 //  - assign to a name (for implementing set!)
 //      if the name exists in the innermost scope, update the value
 //      if it doesn't exist, perform the assignment in the enclosing scope
 //      if we don't find the name, it is an error
 public void assign(Node id, Node val)
 {
     if (this.lookup(id) != null)
     {
         frame.setCdr(new Cons(val, null));
     }
     else if (env.lookup(id) != null)
     {
         env.assign(id, val);
     }
     else
     {
         Console.Error.WriteLine("Name not found Env.assign: " + id.getName());
     }
 }
Пример #6
0
        public Node eval(Node t, Environment e)
        {
            Node current = t.getCdr().getCar();

            if (!current.isSymbol())
            {
                Console.Error.WriteLine("Error: Not an identifier");
                return(Nil.getInstance());
            }
            // insert some methods about env, kinda confusing/binding stuff
            Node final = t.getCdr().getCdr().getCar();

            final = final.eval(final, e);
            e.assign(current, final);
            return(new StringLit("; " + current.getName() + " - updated."));
        }
Пример #7
0
        public void assign(Node id, Node val)
        {
            Node node = find(id, frame);

            if (node == null && env == null)
            {
                Console.Error.WriteLine("Undefined variable " + id.getName());
            }
            else if (node == null)
            {
                env.assign(id, val);
            }
            else
            {
                node.setCar(val);
            }
        }
Пример #8
0
 public void assign(Node id, Node val)
 {
     // if the term and the env are null, variable undefined (error state)
     if (find(id, val) == null && env == null)
     {
         Console.Error.WriteLine("undefined variable: " + id.getName());
     }
     else if (find(id, val) == null)
     {
         // else, if the term is undefined (and env is), assign the term to env
         env.assign(id, val);
     }
     else
     {
         // else, if both term and env are defined, set the car of the term to val
         find(id, frame).setCar(val);
     }
 }
Пример #9
0
        // from prof email: The method assign() is for implementing Set.eval().
        // It modifies the value of an existing variable.
        // The recursive structure is the same as for lookup(), except that after calling find(),
        // the value should be updated instead of returned
        public void assign(Node id, Node val)
        {
            // DONE :: implement this function
            Node value = find(id, frame);

            if (value.isNull() && env == null)
            {
                Console.Error.WriteLine("undefined variable " + id.getName());
            }
            else if (value.isNull())
            {
                env.assign(id, val);
            }
            else
            {
                value.setCar(val);
            }
        }
Пример #10
0
 public override Node eval(Node exp, Environment env)
 {
     int num = Util.expLength(exp);
     //(set-cdr! (assq ’x (car env)) (list 15)), need length 3
     bool flag = num != 3;
     Node instance;
     if (flag)
     {
         Console.Error.WriteLine("Error: invalid expression");
         instance = Nil.getInstance();
     }
     else
     {
         Node car = exp.getCdr().getCar();
         //Console.WriteLine(car);
         Node car2 = exp.getCdr().getCdr().getCar();
         //Console.Writeline(car2)
         env.assign(car, car2.eval(env));
         instance = Unspecific.getInstance();
     }
     return instance;
 }
Пример #11
0
        public override Node eval(Node exp, Environment env)
        {
            int  numArgs = 0;
            Node expCdr  = exp.getCdr();

            while (!expCdr.isNull())
            {
                numArgs++;
                expCdr = expCdr.getCdr();
            }

            if (numArgs != 2)
            {
                Console.Error.WriteLine("Error: invalid expression");
                return(Nil.getInstance());
            }
            Node arg1 = exp.getCdr().getCar();
            Node arg2 = exp.getCdr().getCdr().getCar();

            env.assign(arg1, arg2.eval(env));
            return(new StringLit("#{Unspecific}", false));
        }