Thanks for sharing! Thorsten will be delighted too ;-)
As ever, I can't resist to give insignificant comments:
1. In 'readLines' I would replace the filter function
(filter '((X) X)
because a call to an EXPR is much more expensive than to a SUBR.
2. Instead of (link (pack (line))) it would be a bit cheaper to call
(link (line T)), avoiding some garbage.