예제 #1
0
파일: Do.cs 프로젝트: 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);
        }
예제 #2
0
파일: LambdaForm.cs 프로젝트: nja/keel
        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);
        }
예제 #3
0
파일: DoStar.cs 프로젝트: 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);
     }
 }
예제 #4
0
파일: DoStar.cs 프로젝트: 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);
     }
 }
예제 #5
0
파일: Apply.cs 프로젝트: 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);
        }
예제 #6
0
파일: Do.cs 프로젝트: 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]);
            }
        }
예제 #7
0
파일: Repl.cs 프로젝트: nja/keel
        public Repl(TextReader input, TextWriter output)
        {
            this.environment = new LibraryEnvironment(reader);

            this.stars = InternStars();

            this.input = input;
            this.output = output;
        }
예제 #8
0
파일: SetForm.cs 프로젝트: 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;
        }
예제 #9
0
파일: Atom.cs 프로젝트: nja/keel
        public override LispObject Apply(Cons arguments, LispEnvironment env)
        {
            if (arguments.Car.IsAtom)
            {
                return T.True;
            }

            return LispNull.Nil;
        }
예제 #10
0
파일: Do.cs 프로젝트: 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]);
            }
        }
예제 #11
0
파일: LispEnvironment.cs 프로젝트: nja/keel
        public LispEnvironment(LispEnvironment parent)
        {
            this.parent = parent;
            this.symbols = parent.symbols;
            this.specials = parent.specials;

            if (Level >= 256)
            {
                throw new EnvironmentException("Stack overflow!");
            }
        }
예제 #12
0
파일: Add.cs 프로젝트: 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;
        }
예제 #13
0
파일: If.cs 프로젝트: 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);
        }
예제 #14
0
파일: Defmacro.cs 프로젝트: 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;
        }
예제 #15
0
파일: Divide.cs 프로젝트: 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>());
        }
예제 #16
0
파일: Subtract.cs 프로젝트: 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;
        }
예제 #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;
        }
예제 #18
0
파일: Macro.cs 프로젝트: nja/keel
 public Cons Expand(Cons form, LispEnvironment env)
 {
     var argumentValues = form.Cdr.As<Cons>();
     return this.expander.Apply(argumentValues, this.macroEnv).As<Cons>();
 }
예제 #19
0
파일: Macro.cs 프로젝트: 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;
 }
예제 #20
0
파일: Car.cs 프로젝트: nja/keel
 public override LispObject Apply(Cons argumentValues, LispEnvironment env)
 {
     return Car.Of(argumentValues.Car);
 }
예제 #21
0
파일: Eval.cs 프로젝트: nja/keel
 public override LispObject Apply(Cons arguments, LispEnvironment env)
 {
     return env.Eval(arguments.Car);
 }
예제 #22
0
파일: IntegrationTest.cs 프로젝트: nja/keel
 public IntegrationTest()
 {
     this.reader = new Reader();
     this.env = new LibraryEnvironment(this.reader);
 }
예제 #23
0
파일: DelegateBuiltin.cs 프로젝트: nja/keel
 public override LispObject Apply(Cons arguments, LispEnvironment env)
 {
     return fun();
 }
예제 #24
0
파일: Repl.cs 프로젝트: 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;
        }
예제 #25
0
파일: Quote.cs 프로젝트: nja/keel
 public override LispObject Eval(Cons body, LispEnvironment env)
 {
     return Car.Of(body);
 }
예제 #26
0
파일: SpecialForm.cs 프로젝트: nja/keel
 public abstract LispObject Eval(Cons body, LispEnvironment env);