Kilo Lisp: A Kilo Byte-Sized Lisp System
t3x.org
t3x.org
(you can find most small LISPs there, reply here if you know more to add)
Also, looks like you're missing Kernel: https://web.cs.wpi.edu/~jshutt/kernel.html
[1] https://z3s5.com/ [2] https://github.com/nukata/lisp-in-go
I also wrote a simple lisp in go, in my case I added LSP support for completion and help-on-hover, which was a fun addition I've not seen in anything else.
But I'm adding all the stuff mentioned, thanks!
otus lisp: https://github.com/yuriy-chumak/ol - owl lisp with ffi - http://yuriy-chumak.github.io/ol/
owl can compile to c or interpret - otus is a small interpreter 45kb
https://github.com/ioccc-src/winner/blob/master/1989/jar.2.c (accompanying explanation: https://github.com/ioccc-src/winner/blob/master/1989/jar.2.h... )
It apparently works somewhat after a few minor tweaks.
Another one that I've bookmarked some months earlier: https://github.com/rui314/minilisp
> Lisp for Arduino, Adafruit M0/M4, Micro:bit, ESP8266/32, RISC-V, and Teensy 4.x boards.
And even that needs updated on the site, as it runs on the RP2040 (Pi Pico) as well, with wireless functions on the W variant, even.
Arc, a LISP written in Racket LISP [2] by Paul Graham
Several (tiny) LISP and Scheme implementations [5]
Alan Kay wrote and lectured many times about the LISP eval implementation in itself on page 13 of the LISP 1.5 Manual [6] as the "Maxwells equations of software" [3]
There is an derivation of this idea, a Smalltalk eval written in itself, see chapter IV and Smalltalk 71 [4].
[1] http://www.paulgraham.com/bel.html
[2] http://www.paulgraham.com/arc.html
[3a] https://github.com/informatimago/lisp-1-5/blob/master/LISP-1...
[3b] https://queue.acm.org/detail.cfm?id=1039523
[3c] https://michaelnielsen.org/ddi/lisp-as-the-maxwells-equation...
[4] http://worrydream.com/EarlyHistoryOfSmalltalk/
[5] http://www.iro.umontreal.ca/~feeley/
[6] https://michaelnielsen.org/ddi/wp-content/uploads/2012/04/Li...
https://old.reddit.com/r/lisp/comments/rkxh3v/lisp_with_gc_i...
Unfortunately the discussion ended suddenly back then.
The long story is: you cannot have tail recursion and dynamic scoping without running into all kinds of funny issues related to the upward and downward FUNARG problem. This is discussed in detail in my book, LISP From Nothing (http://t3x.org/lfn/)
Without tail recursion in the core of the implementation (in the case of SectorLISP in the assembly language part), you cannot have it in the high-level part (LISP in LISP), either, because the interpreter interpreting the LISP in LISP will eventually overflow the stack.
KiloLISP is lexically scoped and tail-recursive.
https://github.com/yesco/minimalisp/blob/main/lisp.c
It's not finished yet, but the coding style and tricks going on in it are wild.
Turns out that's exactly what's happened: https://github.com/ioccc-src/winner/blob/master/1989/jar.2.h... https://github.com/ioccc-src/winner/blob/master/1989/jar.2.c
PS: I was able to get it to compile after a few minor tweaks. Impressive stuff.
Kilo LISP - https://news.ycombinator.com/item?id=19415735 - March 2019 (48 comments)
https://picolisp.com/wiki/?home
... in part because of this interesting alternative to Android Studio for interacting with the Android SDK through a LISP REPL:
https://picolisp.com/wiki/?PilBox
Surprisingly the folks behind Clojure were never able to fill this gap despite the Android SDK being based on Java.
One of my long-term goals is to create an analog of AutoHotkey for Android. Tasker is problematic on several levels (poor code quality, single developer syndrome, closed source, ...) and it would be nice for a change to write scripts, instead of fiddle around with Tasker's poorly laid out GUI, to automate Android apps in a REPL environment through directly interacting with the Android Accessibility API.
Might be nice to see one for
The more often you run out of heap, the more often you have to GC, and that memory churn on those very slow CPUs has great impact.
FORTH doesn't have this problem because it's quite static. It "never" reuses memory, the dictionary (where all the code and data live) just gets larger. When it gets too big, you restart/reset the dictionary (via FORGET), and memory reclamation is a simple pointer change.
BASIC only has the memory issue at runtime, specifically with Strings and the heap they're stored on. Everything else is quite static. When you type "RUN", the pointers to the working memory are reset and the variable tables et al are rebuilt as the the program is run.
Since BASIC separates the code from the data, this is easy. FORTH intermixes the code with the data, but since it doesn't reuse any of it, that works quite efficiently.
Lisps tend to mix code and data and that make heap fragmentation a real issue. Slow CPUs make for slow GC.
But, give more memory, GC happens less. When it happens, it's "more", it's "harder", but that can be more acceptable if the user is prepared for it. As I understand it, even the Lisp machines would get into states where it was simply faster to restart than have a "full" GC run.
Memory and MHz makes Lisps much happier. The Commander can have a lot of memory, but it's all in banks. A Lisp, perhaps, could be written that leverages that seamlessly, but it's not free. Not like with, say, a 65816 or the x86 where the banking (segmenting) is part and parcel to the addressing and instruction set vs being bolted on to something like a 6502.
Obviously one can write Lisp that CONSes less, but it's not especially idiomatic.
Other languages tout fast build times (that actually are not that fast) completely unaware they are stuck in slow feedback loops.
Wait until you deal with slow loading process that is independant of your language. (ie even infinitly fast build time wont' save you). Once that data is loaded into your data structure you want it to STAY there. Lisp wills save your butt allowing you to continue to develop with the tight feedback loop.
JS + devtools...
Partially as a result of all this, Lisp has other things that Haskell lacks, such as good editor support and a great REPL. Haskell editor tooling is awful and although it has a REPL it’s nowhere near as good as Common Lisp’s.
I'm looking forward to a replacement; Unison might be it, a lot of its choices are better oriented towards interactive development, but the jury is still out on this. Other candidates imo are lean, agda, roc, verse (this one I heavily doubt), or ghc fixing itself so this discussion is unnecessary. But there is space for a language that cuts out the historical baggage. For a while, I hoped that would be purescript, but I think that unlikely at this point.
It's just different. I love haskell, but also love lisp. For very different reasons, but they're both delightful expressions of thought.
Also the sense of tradition can be appealing - it is the second-oldest language still in use, after FORTRAN, and has been incredibly formative in many respects. It‘s similar to how learning Latin doesn’t only allow you to read a lot of great works of the past, but also helps you understand modern languages.
Well, okay, to be fair the real reason is probably because Common Lisp is very mature, well specified, has a lot of useful libraries (Quicklisp is great), and several implementations can produce very efficient and fast code (about as fast as GC code can be, especially if you make good use of facilities like dynamic-extent).
A dialect Scheme was used in the famous MIT lecture course [2], the video [3] and book[4].
Many computer scientist grew up with thinking in LISP.
[1] https://queue.acm.org/detail.cfm?id=1039523
"So the problem is—I’ve said this about both Smalltalk and Lisp—they tend to eat their young. What I mean is that both Lisp and Smalltalk are really fabulous vehicles, because they have a meta-system. They have so many ways of dealing with problems that the early-binding languages don’t have, that it’s very, very difficult for people who like Lisp or Smalltalk to imagine anything else." -Alan Kay
[2] https://en.wikipedia.org/wiki/Structure_and_Interpretation_o...
[3] https://ocw.mit.edu/courses/6-001-structure-and-interpretati...