I love a good history lesson. :)<p>In case it helps anyone: this is about a version 2 of the original LISP language. It's not about the distinction between a "Lisp-1" and a "Lisp-2", which describe two different families of Lisp languages (those with a single namespace, like Scheme; and those with separate namespaces for values and functions, like Common Lisp).
And a follow-up post is "GTL is a LISP 2 implementation" <a href="https://mcjones.org/dustydecks/archives/2018/06/04/1001/" rel="nofollow">https://mcjones.org/dustydecks/archives/2018/06/04/1001/</a> . Which I note only because it's easily overlooked if one doesn't scroll down far enough.
When your language has to include a built-in swapper to manage the memory you know you are suffering from the second system effect.<p>> The Q-32 version was so cramped for space (approximately 48,000 48-bit words) that an application-level swapper was written: If a function was needed but not in memory 1) if memory space was available, the function was paged in by LISP from an ordinary data file, 2) if space was not available, the memory manager tried to create space by shuffling the in-memory area holding binary code to make space, if this did not work some in-memory code was excised or the GC invoked then 3) the dynamic loader read the binary code into memory.
<a href="http://t3x.org/lisp64k/index.html" rel="nofollow">http://t3x.org/lisp64k/index.html</a><p>Great series of blog posts exploring what you can do with early lisp.
I wonder how far one could get combining the strengths of Haskell's bidirectional type system and Dlang's (<a href="http://dlang.org/" rel="nofollow">http://dlang.org/</a>) efficiency into Lisp to get a fast language.