It's a limitation of S48's GC. I just received the following report from
From: firstname.lastname@example.org (Richard Kelsey)
Yes. Because the byte-code compiler doesn't do any free-variable
analysis, every closure contains its complete lexical environment.
For the first definition of SEARCH-STREAM the LP closure contains
a pointer to the original lazy-list S, causing the heap to blow out.
For Kali I wrote an additional compiler pass that does the necessary
analysis and produces minimal closures. The downside is that loading
code takes over 50% longer.