namespace KumiScript.Interpreter { public class ProperListExpression : Expression { readonly List _values; public ProperListExpression(List expressions) { _values = expressions; } public override Expression Eval(Environment env) { Expression rator = Car().Eval(env); Expression rand = Cdr(); return rator.Apply(rand, env); } public override List EvalMembers(Environment env) { List result = new List(); for (int i = 0; i < _values.Count; i++) result.Add(_values[i].Eval(env)); return result; } public override List GetMembers() { return _values; } public override string ToString() { return string.Concat("(", string.Join(' ', (object[]) _values.ToArray()), ")"); } public override Expression Car() { return _values.First(); } public override Expression Cdr() { List rest = new List(_values); rest.RemoveAt(0); return ListFactory.MakeList(rest); } public override ProperListExpression Cons(Expression expr) { List consd = new List(_values); consd.Insert(0, expr); return new ProperListExpression(consd); } public override ProperListExpression AppendToList(Expression expr) { List appended = new List(_values); appended.Append(expr); return new ProperListExpression(appended); } } }