// Would be nice to make this a virtual member function, but it's // awkward with the recursion for list printing. std::ostream& print(std::ostream& os, const ElemPtr& e, bool first=true) { SymbolPtr sym = to_symbol(e); NumberPtr num = to_number(e); if (sym) { os << sym->value(); } else if (num) { os << num->value(); } else { PairPtr p = to_cons(e); if (p) { if (first) os << "("; if (is_nil(p)) os << ")"; else { if (!(to_symbol(p->car()))) os << "("; print(os, p->car(), false); if (!(is_nil(to_cons(p->cdr())))) os << " "; print(os, p->cdr(), false); } } } return os; }
bool is_nil(const PairPtr& p) { return ((!(p->car())) && (!(p->cdr()))); }