Hacker News new | past | comments | ask | show | jobs | submit login
Lisp implemented in under 1K of JavaScript (github.com/kanaka)
108 points by swannodette on Feb 25, 2015 | hide | past | favorite | 16 comments



This person wrote a lisp in 1K lines of C (not bytes :)), the cool thing is that also includes a copying garbage collector.

https://github.com/rui314/minilisp


I wrote a minimal Lisp compiler (targeting C) when I was a bit younger. :> My GC was just a really bad reference counting implementation though. I dare you to make fun of my "hash function". Hehe.

https://github.com/eugeneia/microlisp


Your hash function is fast! So it's got that going for it.


I had to go look. Not hard to find.

I'll just say this, back in the prehistoric 1970s, a '%' operation was eschewed, because it wasn't fast (relatively speaking)!!!

It often was used anyway, because it's very effective considering its simplicity.


IMO, the garbage collection (along with optimization) is the most interesting part of implementing a lisp.


So much effort to go under 1K (in the era of 128GiB fingernail chips), with this .gitignore:

node_modules -uglify -crush -regpack


Thank you for at least not writing another Brainfuck clone.


It's JSON lists as s-exps, which means (as I understand it) that the author doesn't need to implement parsing, only traversal and evaluation. (Which can essentially be a big-ass case statement.)

    ["def", "foo", 1]
    ["fn", "foo", ["a", "b"], […]]
It's not the most attractive Lisp I've seen…


So write a lisp parser, then dump the result into this. I like that they didn't include a parser in compacted code, such a parser wouldn't be very interesting.


So, uhmm,

    def parse(s): return json.loads('['+re.sub('([")])\s*(["(])','\g<1>,\g<2>',re.sub('[^()\s]+','"\g<0>"',s)).replace('(','[').replace(')',']')+']')
works for python, I'm assuming javascript has something equally small


Yes, uninteresting, as I said. Lisp syntax is quite simple, so I would not expect it to be very difficult to make a regex to parse it. Btw, does that handle quoted strings, strings with syntax characters in them, and strings with escapes?


And dotted pairs ? I had a super cute sexp parser in PHP, until I started handling sexp fully.


Would dotted pair notation make sense for this lisp where lists are arrays, not linked cons cells?


IMHO, yes, binary building blocks matter a lot in lisp philosophy, whether or not they're built on javascript arrays.


Thanks for responding, man. That's my point though. There is no cons building block in this lisp. I don't think (1 2 . 3) can be represented in it so having the notation for it makes no sense.


I wrote a minimal Lisp for PHP in about an hour: https://gist.github.com/TazeTSchnitzel/44720ea3aec64a9e330a




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: