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); }
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); }