5 ms·
(How to Write a (Lisp) Interpreter (In Python)) (2010)
- tosh 4mo agoI can't recommend highly enough to implement a simple lisp (or a forth). Illuminating experience and it will also help you see (among many other things) the parentheses in a different light.
- stdatomic 4mo agoFirst day of paradigms course in the 2000s and prof says "if your opinion of Scheme is too many parentheses, then you're an idiot." Needless to say that was my opinion and every day I think, more and more, how right he was. (later I did make some gui apps that included scripting and chose s-expr syntax because of how simple it is to implement it)
- NooneAtAll3 4mo agomain problem isn't brackets themselves - it's that they're too on the right had brackets been displayed as curly braces in C - everything would look much more manageable
- phpnode 4mo agoso, instead of (foo (bar (1 2 3)) you'd prefer { foo { bar { 1 2 3 } } } is that right?
- irishcoffee 4mo agoEmacs vs vim, go!
- NooneAtAll3 4mo ago( aar (bar1 1 2 3) (bar2 1 2 3) (bar3 (car1 2 3) (car2) (car3) ) ) vs (aar (bar1 1 2 3) (bar2 1 2 3) (bar3 (car1 2 3)(car2)(car3)))
- eska 4mo agoI changed my opinion about parens when I stopped formatting like C, and used indent rather than parens to denote blocks. That is, a large amount of them at the end is totally fine.
- shakna 4mo agoI actually find wisp [0] harder to read/write than just plain Scheme. But there's quite a few little reader projects that swap out the first layer of syntax for another. Lisp isn't entirely tied to one representation. [0] https://www.draketo.de/software/wisp https://www.draketo.de/software/wisp
- bananaflag 4mo agoThere are two problems with Lisp parentheses in my opinion: 1) Humans are not that equipped to handle that level of nesting without some other aid, this is why Lisp code is usually indented. 2) Parentheses aren't just about grouping, and this is unintuitive. For example, x is not the same as (x). This is a bit like in set theory where x is not the same as {x}, but parentheses do not look like the kind of sign that would work like that.
- urcite_ty_kokos 4mo agoAppreciated the title xD
- e12e 4mo ago(2010)?
- zahlman 4mo ago(how-to in-python (write (interpreter lisp)))
- consumer451 4mo agoYes, but to be fair, you only have a couple minutes to fight the HN title regex.
- azhenley 4mo agoWriting a Lisp is one of my favorite projects. I try to do it every year or two, taking a different approach each time.
- onraglanroad 4mo agoThe one where you replaced parentheses with the crying laughing emojis was definitely the worst.
- all2 4mo agoThis sounds amazing.
- onraglanroad 4mo agoI enjoyed thinking about it. Maybe replace if...else with great...sad etc
- chombier 4mo agoIf you ever wondered how to write a programming language, this is probably the best resource to get started (and then of course Crafting Interpreters). See also part 2 https://norvig.com/lispy2.html https://norvig.com/lispy2.html
- embedding-shape 4mo agoI've always found MAL ("Make-A-Lisp" https://github.com/kanaka/mal https://github.com/kanaka/mal) a bit more approachable, probably because I was out after creating my own programming language before I've written much Python. It's language agnostic, and really easy to follow along with most programming languages out there, explaining everything as you progress. That it's language agnostic and somehow matters feels weird now a lot of time (and experience I suppose) afterwards, but back when I only knew 1-2 languages by heart, also having to face understanding Python at the same time from Norvigs guide/reference made it slightly more complicated for me. I use this as a litmus test now when coming across new languages (implementing MAL in the new language), as it's such an easy approach to practically test large parts of the new language, and there is always host-language-specific tricks you can learn along the way.
- librasteve 4mo agoor you could just use Raku and its “surprisingly good lisp impression”: https://www.codesections.com/blog/raku-lisp-impression/ https://www.codesections.com/blog/raku-lisp-impression/
- joshuamorton 4mo agoThere are edge cases where this fails, but `def parse(s): return json.loads('['+re.sub('([")])\s*(["(])','\g<1>,\g<2>',re.sub('[^()\s]+','"\g<0>"',s)).replace('(','[').replace(')',']')+']')` is a surprisingly robust lisp parser.
- timonoko 4mo ago[flagged]
- chamomeal 4mo agoI mean it’s still worth doing, even if AI can do it. But I definitely empathize with that bit of AI ennui.
- tosh 4mo agois learning how to accomplish or understand something boring just because someone or something else does it better?
- genxy 4mo agoThere is always someone better than you at almost everything you do, this is statistical reality. If all you care about is the artifact and not the path, there is no reason to do anything. Use the tool to better yourself, your understanding and push the limits of what is possible. If a Lisp in assembly with GC is now hello world, change what a hard project is. I see this attitude a lot, and I think it is rooted in a sort of self-centered elitism. Anyone can do it, so why do it? Instead you could have the AI teach you how to implement it yourself with a deep understanding that no human, even if you paid them, would put up with. But sure, get depressed. But why tho?
- matheusmoreira 4mo ago> I see this attitude a lot, and I think it is rooted in a sort of self-centered elitism. Anyone can do it, so why do it? The undercurrent is that nobody will be able to make a career out of it anymore. Sure, programming is intellectually stimulating, but it's questionable whether it'll lead to highly compensated jobs now. I'm a hobbyist who loves computers so I'm still going to do it. I have been entertaining thoughts of doing it professionally though. The market isn't encouraging at all.
- genxy 4mo agoIt changes what you can do and how you do it, but it still needs someone with skills to drive it. And it does hit a capability plateau, you cannot just say, "make me a compiler for xyz". Your prompt has to be at least 8 sentences. A skilled programmer and a skilled user of AI can do amazing things. But you need to be both. Lay persons cranking out zombie react sites shouldn't be scaring anyone. It is good to have a half functioning prototype, it allows everyone to have something to bounce ideas off of.
- RedCinnabar 4mo agoMan these kind of resources have aged really bad in the age of AI.
- jgalt212 4mo agoHow so?
- Crespyl 4mo agoWhy would AI make these age worse than, say, libraries or languages becoming obsolete? I don't think a good learning resource gets worse just because there's a newer alternative.
- RedCinnabar 4mo ago> I don’t think a good learning resource gets worse[...] Probably not, but they become irrelevant. The other day I found an old programming book at my parents’ and while it was still a terrific resource, I couldn’t image anyone learning a language from a book nowadays. AI is doing the same thing but 100 times effectively than anything else.
- incanus77 4mo agoHow do you mean “these kind”?
- RedCinnabar 4mo agoBlog tutorials, guides, programming books and youtube tutorials. They are completely irrelevant in a time where you have a personal tutor willing to explain every single detail of a subject.
- macintux 4mo agoThat's like saying your grandfather is irrelevant now that he's spawned children and grandchildren. Good luck to those personal tutors without this source material.
- deleted 4mo ago[deleted]
- timonoko 4mo ago?
- Jtsummers 4mo agoWhy did you replace your very similar comment with "--" just to post essentially the same thing again?
- deleted 4mo ago[deleted]
- deleted 4mo ago[deleted]
- deleted 4mo ago[deleted]
- timonoko 4mo agoI actually perfected the Norvig Lisp at one time. It has compiler to python and just everything. Those very few here that can actually read code, understand why this project soon exploded into biggest piece of odorous excrement. https://github.com/timonoko/nokolis.py https://github.com/timonoko/nokolis.py
- dang 4mo agoIs it classics day or something? (Fine with us!) Related: (How to Write a (Lisp) Interpreter (In Python)) (2010) - https://news.ycombinator.com/item?id=39665939 https://news.ycombinator.com/item?id=39665939 - March 2024 (91 comments) (How to Write a (Lisp) Interpreter (In Python)) (2010) - https://news.ycombinator.com/item?id=30443949 https://news.ycombinator.com/item?id=30443949 - Feb 2022 (9 comments) (How to Write a (Lisp) Interpreter (In Python)) - https://news.ycombinator.com/item?id=30327437 https://news.ycombinator.com/item?id=30327437 - Feb 2022 (3 comments) (How to Write a (Lisp) Interpreter (In Python)) - https://news.ycombinator.com/item?id=26036431 https://news.ycombinator.com/item?id=26036431 - Feb 2021 (1 comment) How to Write a Lisp Interpreter In Python (2010) - https://news.ycombinator.com/item?id=20590439 https://news.ycombinator.com/item?id=20590439 - Aug 2019 (29 comments) How to Write a Lisp Interpreter in Python (2010) - https://news.ycombinator.com/item?id=12777852 https://news.ycombinator.com/item?id=12777852 - Oct 2016 (28 comments) How to Write a Lisp Interpreter in Python (2010) - https://news.ycombinator.com/item?id=7825054 https://news.ycombinator.com/item?id=7825054 - May 2014 (41 comments) (How to Write a ((Better) Lisp) Interpreter (in Python)) - https://news.ycombinator.com/item?id=1746916 https://news.ycombinator.com/item?id=1746916 - Oct 2010 (10 comments) (How to Write a (Lisp) Interpreter (in Python)) - https://news.ycombinator.com/item?id=1745322 https://news.ycombinator.com/item?id=1745322 - Sept 2010 (39 comments)
- timonoko 4mo agoMy Lisp from 1975 was actually used in real world and highly lucrative. Gemini could read the source code, but it told that my code was piece of shit and cannot be implemented in 64-bit world without drastic changes, so it made an example. But that version was just too advanced and too complex as a study subject. There are already enuff good Lisps in the world, methinks. https://github.com/timonoko/nokolisp https://github.com/timonoko/nokolisp
- sashank_1509 4mo agoDepressing to think that AI will be doing most of this in the future. Sharing it freely in the internet, basically ensures AI can copy it well.
- deleted 4mo ago[deleted]
- adamddev1 4mo agoInterestingly enough, linguists also use Lisp-like parentheses or brackets to annotate sentence structures. Trees and brackets are isomorphic, as both phrase structure grammarians and the original SICP lectures pointed out. The brackets in the title sentence would look a lot different though. ;-)
- userbinator 4mo agoAnd in the other direction, here's a Python interpreter written in Lisp: https://github.com/metawilm/cl-python https://github.com/metawilm/cl-python
- leonardool 4mo agoI've been working on a similar (ish) project for a while: Ribbit (https://github.com/udem-dlteam/ribbit https://github.com/udem-dlteam/ribbit). Supports a full R4RS REPL (with tail-calls) in the same sizes as Lispy (8Kb for JavaScript and 6.5Kb for x86)!
- unfirehose 4mo ago[flagged]
- ljcoco 4mo agoarticle to follow between all the ai noises these days
- mathnode 4mo ago;;;; Not sorry )
- wmedrano 4mo agoI made a rusty version of this. No linked lists, but that's not important in the grand Scheme of things. https://wmedrano.dev/post/2025/11/15/lisp-1 https://wmedrano.dev/post/2025/11/15/lisp-1
- jll29 4mo agoStrangely, Peter's 1987 Ph.D. thesis cites itself (reference 90), but with the year being off by one (1986). Writing a LISP in Python is only for educational use, or to have a boostrap LISP that you can write a better (faster) LISP in.
- leontrolski 4mo agoSimilarly - 80 line LISP interpreter with integers, lexical scope, first class functions https://leontrolski.github.io/interpreter.html https://leontrolski.github.io/interpreter.html
- avilay 4mo agoI'll put in a plug for David Beazly's SICP course. While we didn't build a full Lisp interpreter, we built something similar over a week-long hands-on course. I believe his github for the course is private and only available to students. https://www.dabeaz.com/sicp.html https://www.dabeaz.com/sicp.html
- okaleniuk 4mo agoClassics! There is a different take on Lisp in Python - fakelisp. It's literally Lisp in Python, not an interpreter, but a syntax sugar library that allows embedding Lisp snippets into valid Python. https://codeberg.org/okaleniuk/fakelisp https://codeberg.org/okaleniuk/fakelisp from fakelisp import * # And now you can start mixing Python and LISP X = (BEGIN (SET (F) (LAMBDA (X) (IF (EQ (X) (1)) (1) (MUL (X) (F (SUB (X) (1))))))) (LIST (F (4)) (42))) # Back to Python any time print "x: ", str(X)