Example #1
0
        public bool Lookup(Symbol ident)
        {
            if (Variables.ContainsKey(ident.Name))
            {
                return(true);
            }

            return(Parent != null && Parent.Lookup(ident));
        }
        public Cons MacroProcessing(Cons seq)   // TODO
        {
            var rseq = new Cons();

            foreach (var o in seq.GetIterator())
            {
                var exp = o.Car();

                if (exp is Cons)
                {
                    var op        = exp.Car() as Symbol;
                    var arguments = exp.Cdr() as Cons;

                    if (op?.Name == "define-syntax")
                    {
                        DefineMacro(arguments);
                        continue;
                    }
                    else if (Macro.Lookup(op))
                    {
                        foreach (var o1 in (Macro.Get(op).Expand(arguments)).GetIterator())
                        {
                            if (o1.Car() is Cons)
                            {
                                rseq.Add(MacroProcessing(o1.Car()));
                            }
                            else
                            {
                                rseq.Add(o1.Car());
                            }
                        }

                        continue;
                    }

                    rseq.Add(MacroProcessing(exp));
                }
                else
                {
                    rseq.Add(exp);
                    var rest = o?.Cdr();
                    if (!(rest is Cons))
                    {
                        rseq.Add(rest, true);
                    }
                }
            }
            return(rseq);
        }
Example #3
0
        public static Cons MExpand(Cons seq)   // TODO
        {
            var rseq = new Cons();

            foreach (var o in seq.GetIterator())
            {
                var exp = o.Car();

                if (exp is Cons)
                {
                    var op        = exp.Car() as Symbol;
                    var arguments = exp.Cdr() as Cons;

                    if (op?.Name == "defmacro")
                    {
                        var mName = arguments?.Car().Car() as Symbol;
                        var mArg  = arguments?.Car().Cdr() as Cons;
                        var mBody = arguments?.Cdr() as Cons;
                        macro.Define(mName, new Macro(mArg, mBody));
                        continue;
                    }
                    else if (macro.Lookup(op))
                    {
                        foreach (var o1 in (macro.Get(op).Expand(arguments)).GetIterator())
                        {
                            rseq.Add(o1.Car());
                        }

                        continue;
                    }
                }

                rseq.Add(exp);
            }
            return(rseq);
        }