Ejemplo n.º 1
0
Archivo: Do.cs Proyecto: nja/keel
        public override LispObject Eval(Cons body, LispEnvironment env)
        {
            var varForms = body.Car.As<Cons>();
            var varSymbols = varForms.Select(x => x.As<Cons>().Car.As<Symbol>()).ToList();
            var varInitForms = varForms.Select(x => x.As<Cons>().Cdr.As<Cons>().Car).ToList();
            var varStepForms = varForms.Select(x => x.As<Cons>().Cdr.As<Cons>().Cdr.As<Cons>().Car).ToList();

            var cadr = body.Cdr.As<Cons>().Car.As<Cons>();
            var testForm = cadr.Car;
            var resultForms = cadr.Cdr.As<Cons>();
            var doBody = body.Cdr.As<Cons>().Cdr.As<Cons>();

            var doEnv = new LispEnvironment(env);

            SetInitValues(doEnv, varSymbols, varInitForms);

            while (doEnv.Eval(testForm).IsNil)
            {
                new Progn().Eval(doBody, doEnv);

                SetStepValues(doEnv, varSymbols, varStepForms);
            }

            return new Progn().Eval(resultForms, doEnv);
        }
Ejemplo n.º 2
0
        public override LispObject Eval(Cons body, LispEnvironment env)
        {
            var lambdaList = body.Car.As<Cons>();
            var progn = Progn.Wrap(body.Cdr.As<Cons>(), env);

            return new Lambda(lambdaList, progn, env);
        }
Ejemplo n.º 3
0
Archivo: DoStar.cs Proyecto: nja/keel
 protected override void SetInitValues(LispEnvironment doEnv, List<Symbol> varSymbols, List<LispObject> varInitForms)
 {
     for (int i = 0; i < varSymbols.Count; i++)
     {
         var val = doEnv.Eval(varInitForms[i]);
         doEnv.AddBinding(varSymbols[i], val);
     }
 }
Ejemplo n.º 4
0
Archivo: DoStar.cs Proyecto: nja/keel
 protected override void SetStepValues(LispEnvironment doEnv, List<Symbol> varSymbols, List<LispObject> varStepForms)
 {
     for (int i = 0; i < varSymbols.Count; i++)
     {
         var val = doEnv.Eval(varStepForms[i]);
         doEnv.SetValue(varSymbols[i], val);
     }
 }
Ejemplo n.º 5
0
Archivo: Apply.cs Proyecto: nja/keel
        public override LispObject Apply(Cons argumentValues, LispEnvironment env)
        {
            var fun = argumentValues.Car.As<Function>();
            var args = argumentValues.Cdr.As<Cons>();

            var spread = Spread(args);

            return fun.Apply(spread, env);
        }
Ejemplo n.º 6
0
Archivo: Do.cs Proyecto: nja/keel
        protected virtual void SetStepValues(LispEnvironment doEnv, List<Symbol> varSymbols, List<LispObject> varStepForms)
        {
            var stepValues = varStepForms.Select(doEnv.Eval).ToList();

            for (int i = 0; i < varSymbols.Count; i++)
            {
                doEnv.SetValue(varSymbols[i], stepValues[i]);
            }
        }
Ejemplo n.º 7
0
Archivo: Repl.cs Proyecto: nja/keel
        public Repl(TextReader input, TextWriter output)
        {
            this.environment = new LibraryEnvironment(reader);

            this.stars = InternStars();

            this.input = input;
            this.output = output;
        }
Ejemplo n.º 8
0
Archivo: SetForm.cs Proyecto: nja/keel
        public override LispObject Eval(Cons body, LispEnvironment env)
        {
            var symbol = Car.Of(body).As<Symbol>();
            var value = env.Eval(Car.Of(Cdr.Of(body)));

            env.SetValue(symbol, value);

            return value;
        }
Ejemplo n.º 9
0
Archivo: Atom.cs Proyecto: nja/keel
        public override LispObject Apply(Cons arguments, LispEnvironment env)
        {
            if (arguments.Car.IsAtom)
            {
                return T.True;
            }

            return LispNull.Nil;
        }
Ejemplo n.º 10
0
Archivo: Do.cs Proyecto: nja/keel
        protected virtual void SetInitValues(LispEnvironment doEnv, List<Symbol> varSymbols, List<LispObject> varInitForms)
        {
            var varInitValues = varInitForms.Select(doEnv.Eval).ToList();

            for (int i = 0; i < varSymbols.Count; i++)
            {
                doEnv.AddBinding(varSymbols[i], varInitValues[i]);
            }
        }
Ejemplo n.º 11
0
        public LispEnvironment(LispEnvironment parent)
        {
            this.parent = parent;
            this.symbols = parent.symbols;
            this.specials = parent.specials;

            if (Level >= 256)
            {
                throw new EnvironmentException("Stack overflow!");
            }
        }
Ejemplo n.º 12
0
Archivo: Add.cs Proyecto: nja/keel
        public override LispObject Apply(Cons argumentsValues, LispEnvironment env)
        {
            LispNumber sum = new LispInteger(0);

            foreach (var addend in argumentsValues)
            {
                var num = addend.As<LispNumber>();
                sum = sum.Add(num);
            }

            return sum;
        }
Ejemplo n.º 13
0
Archivo: If.cs Proyecto: nja/keel
        public override LispObject Eval(Cons body, LispEnvironment env)
        {
            var testForm = Car.Of(body);
            var thenForm = Car.Of(Cdr.Of(body));
            var elseForm = Car.Of(Cdr.Of(Cdr.Of(body)));

            if (env.Eval(testForm).IsTrue)
            {
                return env.Eval(thenForm);
            }

            return env.Eval(elseForm);
        }
Ejemplo n.º 14
0
Archivo: Defmacro.cs Proyecto: nja/keel
        public override LispObject Eval(Cons defmacroBody, LispEnvironment env)
        {
            var symbol = defmacroBody.Car.As<Symbol>();
            var lambdaList = Car.Of(Cdr.Of(defmacroBody));
            var macroBody = Cdr.Of(Cdr.Of(defmacroBody)).As<Cons>();
            var progn = Progn.Wrap(macroBody, env);

            var macro = new Macro(symbol.Name, lambdaList, progn, env);

            env.AddBinding(symbol, macro);

            return macro;
        }
Ejemplo n.º 15
0
Archivo: Divide.cs Proyecto: nja/keel
        public override LispObject Apply(Cons arguments, LispEnvironment env)
        {
            var argList = new List<LispObject>(arguments);

            if (argList.Count < 2)
            {
                throw new EvaluateException("Too few arguments to " + this.Name);
            }

            if (argList.Count > 2)
            {
                throw new EvaluateException("Too many arguments to " + this.Name);
            }

            return argList[0].As<LispNumber>().DivideBy(argList[1].As<LispNumber>());
        }
Ejemplo n.º 16
0
Archivo: Subtract.cs Proyecto: nja/keel
        public override LispObject Apply(Cons arguments, LispEnvironment env)
        {
            if (arguments.IsNil)
            {
                throw new EvaluationException("Too few arguments to " + Name);
            }

            if (arguments.Cdr.IsNil)
            {
                return arguments.Car.As<LispNumber>().Negate();
            }

            var difference = arguments.Car.As<LispNumber>();

            foreach (var subtrahend in arguments.Cdr.As<Cons>())
            {
                difference = difference.Add(subtrahend.As<LispNumber>().Negate());
            }

            return difference;
        }
Ejemplo n.º 17
0
        public override LispObject Apply(Cons arguments, LispEnvironment env)
        {
            if (arguments.IsNil)
            {
                throw new EvaluationException("Too few arguments to " + Name);
            }

            var previous = arguments.Car.As<LispNumber>();

            foreach (var arg in arguments.Cdr.As<Cons>())
            {
                var num = arg.As<LispNumber>();

                if (!test(previous, num))
                {
                    return LispNull.Nil;
                }

                previous = num;
            }

            return T.True;
        }
Ejemplo n.º 18
0
Archivo: Macro.cs Proyecto: nja/keel
 public Cons Expand(Cons form, LispEnvironment env)
 {
     var argumentValues = form.Cdr.As<Cons>();
     return this.expander.Apply(argumentValues, this.macroEnv).As<Cons>();
 }
Ejemplo n.º 19
0
Archivo: Macro.cs Proyecto: nja/keel
 public Macro(string name, LispObject lambdaList, Cons macroBody, LispEnvironment macroEnv)
 {
     this.name = name;
     this.expander = new Lambda(lambdaList, macroBody, macroEnv);
     this.macroEnv = macroEnv;
 }
Ejemplo n.º 20
0
Archivo: Car.cs Proyecto: nja/keel
 public override LispObject Apply(Cons argumentValues, LispEnvironment env)
 {
     return Car.Of(argumentValues.Car);
 }
Ejemplo n.º 21
0
Archivo: Eval.cs Proyecto: nja/keel
 public override LispObject Apply(Cons arguments, LispEnvironment env)
 {
     return env.Eval(arguments.Car);
 }
Ejemplo n.º 22
0
 public IntegrationTest()
 {
     this.reader = new Reader();
     this.env = new LibraryEnvironment(this.reader);
 }
Ejemplo n.º 23
0
 public override LispObject Apply(Cons arguments, LispEnvironment env)
 {
     return fun();
 }
Ejemplo n.º 24
0
Archivo: Repl.cs Proyecto: nja/keel
        private LispEnvironment GetLoopEnvironment(Action action)
        {
            var symbol = environment.Symbols.Intern("QUIT");
            var builtin = new DelegateBuiltin(symbol.Name, () => { action(); return T.True; });

            var loopEnv = new LispEnvironment(environment);
            loopEnv.AddBinding(symbol, builtin);

            for (int i = 0; i < stars.Length; i++)
            {
                loopEnv.AddBinding(stars[i], LispNull.Nil);
            }

            return loopEnv;
        }
Ejemplo n.º 25
0
Archivo: Quote.cs Proyecto: nja/keel
 public override LispObject Eval(Cons body, LispEnvironment env)
 {
     return Car.Of(body);
 }
Ejemplo n.º 26
0
 public abstract LispObject Eval(Cons body, LispEnvironment env);