Quasiquote (and macroexpand) replace the AST in eval.
This makes releasing the memory harder, so could give
rise to both double-frees, and memory leaks.
Eval now releases both its environment (for tail calls)
and the AST.
* Better handling of the final element in quasiquote
* Cons now increments reference counts of objects pointed to
so they are not accidentally deleted
Now passes step7 tests again, including new test
Needed to call quasiquote with first AST element,
which then wrapped symbol in (quote )
Two tests still failing. One for cons with empty list,
and another due to concat returning a vector
Quoting not yet working properly, so symbols in the input
AST are evaluated when they should not be.
Example failing test:
(quasiquote (1 a 3))
The quasiquote function turns this into
(cons 1 (cons a (quote (3))))
rather than
(cons 1 (cons (quote a) (quote (3))))