private Datum compound()
{
if (next.Type != TokenType.Open)
return null;
readNext();
var elements = new List<Datum>();
var cdr = nil;
while(next.Type != TokenType.Close)
{
if (elements.Count > 0 && next.Type == TokenType.Dot)
{
cdr = readCdr();
break;
}
elements.Add(expression());
expectNext(")");
}
elements.Reverse();
var result = elements.Aggregate(cdr, (current, d) => cons(d, current));
var resultPair = result as Pair;
if(resultPair != null)
resultPair.Location = string.Format("{0}:{1}", s.Filename, s.LineNumber);
return result;
}