/// <summary> /// (= { symbol value}*) /// </summary> public static Object Setq(Cons args, LSharp.Environment environment) { string v = "";//"//(setq " + Printer.ConsToString(args) + ")" + NewLine; while (args != null) { Symbol s = (Symbol)args.First(); Cons sec = args.Second() as Cons; if (sec != null) { Symbol ss = sec.First() as Symbol; if (ss == Symbol.FromName("fn")) { Closure c = Runtime.Eval(sec, environment) as Closure; environment.Assign(s, c); extracode += Closure( new Cons(s), environment); args = (Cons)args.Cddr(); continue; } if (ss == Symbol.FromName("macro")) { Macro m = Runtime.Eval(sec, environment) as Macro; environment.Assign(s, m); args = (Cons)args.Cddr(); continue; } } v += GenerateAssign(s,Generate(args.Second(),environment), environment); args = (Cons)args.Cddr(); } return v; }
public static string GenerateAssign(Symbol s, object value, LSharp.Environment environment) { if (environment.Contains(s)) { object sn = environment.GetValue(s); return string.Format(@"{1} {0} = retval;", sn, value) + NewLine; } else { environment.Assign(s, s.Name); return string.Format(@"{1} object {0} = retval;", s.Name, value) + NewLine; } }