[HN Gopher] Learn Lisp the Hard Way ___________________________________________________________________ Learn Lisp the Hard Way Author : Tomte Score : 197 points Date : 2023-01-10 15:31 UTC (7 hours ago) (HTM) web link (llthw.common-lisp.dev) (TXT) w3m dump (llthw.common-lisp.dev) | JLCarveth wrote: | A question I have that's not answered by the link is _why_ would | I want to learn lisp? If you were starting a project today, what | are some of the features Lisp offers that make it a better choice | than any other (more popular) language? And do those features | outweigh the lack of community the larger languages have? | lordgroff wrote: | There are macros in other languages but nowhere will they merge | with the language as effortlessly as in the case of Lisp's | syntax. | | The way Lisp is structured means that almost certainly if | you're missing language feature X you can bolt it on, stacking | the new features on top of each other to make whatever | abstraction you see fit. | | It's the kind of thing that makes a Lisp head amused when | someone talks about the genius of C# and LINQ (as an example). | If you need an abstraction in Lisp, you can almost certainly | build it in an ergonomic fashion that just doesn't have a | parallel in other languages. | | It's one of those powers you don't fully appreciate until you | have it and then every other language seems hilariously | inadequate in comparison. With great power cones great | responsibility and it can all crumble with a lack of discipline | (hence why I'm also a fan of ridiculously restrictive languages | like Go), but honestly the sort of meta programming possible in | Lisp has no equal I know of. | michaelsbradley wrote: | Maybe try Nim. It's a statically typed compiled language | _and_ sports a macro system that allows for direct | manipulation of the AST. If you don 't need to write full | blown macros, Nim also offers templates, which are a simpler | form of Nim's macros: simpler to write, but not quite as | expressive. | | https://nim-lang.org/docs/manual.html#macros | | https://nim-lang.org/docs/manual.html#templates | dmux wrote: | For me, I've always been fascinated with "live programming | environments" and that's been the driving force behind me | diving into Common Lisp. I've really come to appreciate this | way of working: I was recently working on a web-app that talks | to a PostgreSQL database. Normally when developing an app that | talks to a database, I'll likely poke around and test out some | queries using pgAdmin, the command line, etc. In my Common Lisp | app however, once I've got a connection-object to the database, | I can just write my queries _within_ the running Lisp system | and completely remove the need for those other tools. The plus | side is that the data I get back is already in a format that | Lisp can deal with. The liveness of the Lisp system really | allows for "exploratory" programming. | rjsw wrote: | I use Common Lisp because applications run faster than those | written in Python or Ruby and are easier for me to write than | if I was using C++. | julianeon wrote: | A good use case is Emacs. | | Haven't you ever thought "hmm, I could do this job faster if I | had my own plugin/extension here?" | | Lisp is really good for that, when used within Emacs. | Extensions are very very simple, basically just the simplest | functions inserted into your .emacs file. | mikelevins wrote: | If the Lisp way of thinking about and solving problems is a | good fit for you, then you should learn it because it will make | you happier and more productive. If not, then don't bother. | | That's a Catch-22, of course. How will you know if it's a good | fit for you unless you learn it? | | So that reduces the decision to: if you are curious whether | Lisp is a good fit for you, learn enough of it to find out. If | you're not curious about that, don't bother. | | But you might want a preview of what things make it a good fit | for some people. Lisp in general, and Common Lisp in | particular, is a good fit for me because its default mode of | operation is to start the Lisp running and teach it by | interacting with it expression-by-expression how to be the | program I want to build. Common Lisp is consciously designed to | work this way, and provides a host of well-designed | conveniences for it. It turns out that working that way makes | me happier and more productive than working any other way, so | it's my favorite programming language. | | Not very many other programming languages work that way, but to | be fair, some do. Examples of some that do are Smalltalk, | FORTH, and Factor. | | Some languages and implementations provide more support than | others for that style of work. The most comprehensive support | for it is to be found in Common Lisp and Smalltalk | implementations. | | If that sounds interesting, then it's probably worth your time | to learn Lisp (or one of the other languages I mentioned). If | not, then I wouldn't worry about it. | [deleted] | FatActor wrote: | Do you speak multiple human languages? I speak English and | French. There are subjective future tenses in French that can | be transliterated, but don't really capture the spirit of the | writer: one needs to elaborate in English with such verbosity | that it takes a page in English to explain a sentence in | French. I'm sure the reverse is true were I a native French | speaker. My theory as to why so many existentialists were | french was because the language was made for it. :) | | Same goes for computer languages. I use LISP when I have | computer science-y things I want to explore. For example, I was | working on a path finding algorithm for fun years ago and I | went to LISP because it is much more natural at conceptual | programming. But I wouldn't use LISP to create a GUI, even | though it can, nor would I try to write performant 3D graphics. | But I would use it to craft a game engine (I wrote a frame | language in the early 2000's as part of a game engine that I | never finished because once i got the agents decision making | working I felt satisfied enough). | | The right tool for the right job... | | Need to munge a file? PERL | | Need to write an embedded application? C | | Need to write a GUI? A JS framework (or Qt, or Motif/X if I'm | feeling nostalgic) | | Need to write a fast loop? ASM | | Need to write a something stats-related? Python, R, JMP | | Need to explore a computer science problem? LISP, SmallTalk (I | don't know Haskell) | | Need to work on a project that you're forced to? C++ :) | satvikpendem wrote: | Read this: An Intuition for Lisp Syntax | (https://stopa.io/post/265) | | Lisp is simply a different way of thinking, in S-expressions. | It's hard to explain but easier to show you, via the above | link. | ekidd wrote: | I haven't actively used Common Lisp in years. But for a long | time, I used it professionally. | | Common Lisp's greatest strength is that it's "the programmable | programming language." You can customize everything from the | lexer to the syntax, and you can extensively customize or even | replace the object model. It's trivial to write code that | writes code. | | There are some limitations. Haskell, for example, is less | customizable but it works very well at high levels of | _mathematical_ abstraction. | | Now, in practice, I don't often need the specific kinds of | power that Lisp offers. Or rather, when I do need it, I don't | need that power instantly at my fingertips. Completely | customizing your programming language is something you should | think long and hard before doing, and the median team will do | it very badly. So I'm happy with the tradeoff offered by Rust | macros, for example: They're harder to use than Common Lisp | macros, so you only use them when you need them badly enough. | Even for most above-average teams, I think it's a net win for | macros to be a bit obnoxious to use. | | But if you ever find yourself on a small team of incredibly | talented programming language designers, and you're working in | a problem space where no off-the-shelf language can do what you | need, then Common Lisp is well worth a hard look. | | Paul Graham's "On Lisp" is actually an excellent overview of | the kinds of things you can do with Lisp. Norvig's first AI | book is also a good demonstration of Lisp, even if the "AI" | part is hopelessly obsolete at this point. | JLCarveth wrote: | Just downloaded "On Lisp", thank you for the suggestion! | srcreigh wrote: | Lisp shines with macros. I like to use macros to add new static | checks to the code | | For ex I wrote about one such check here | https://tech.perpetua.io/2022/01/generating-sqlite-bindings-... | | This macro checks SQLite table/column references. Aka, if you | try to access user_id when the table doesn't have that column, | the "user_id" text in your code will appear as a syntax error | in your IDE and when you run the code. | | The typed racket project is a bigger example. They added a | typechecking system to the language, including a new typescript | like variant. | | I'm not aware of any other language where 10 lines of idiomatic | code right in your codebase can add a new IDE warning. | ravi-delia wrote: | Honestly I just really like the ergonomics of CL. A lot of the | features totally exist elsewhere, but weirdly you don't see | things like implicit return or a total focus on expressions in | dynamic languages too often. Also, I'm a weirdo that genuinely | finds parentheses pretty. It's the language I use for all my | personal projects because it's the language I enjoy using the | most. I don't think I'd use it for work though- the benefits | are pretty individual, and people in general seem to like C | over CL. | weaksauce wrote: | > but weirdly you don't see things like implicit return | | that's been a thing in ruby since probably forever and it's | one of the defining things about it | tmtvl wrote: | Ruby might have taken that from Perl, which also implicitly | returns the last evaluated statement in a subroutine. | weaksauce wrote: | probably did... ruby took a lot from perl... also took a | lot from many other languages but perl probably the most | lilith_of_debts wrote: | Fun fact: Matz was a lisper prior to creating ruby. He | even wrote an email client entirely in Emacs lisp. | | Not wrong that ruby took a lot from perl, but it was | heavily influenced by lisp and smalltalk and I'd | personally argue those are the two largest influences. | | It does seem that ruby was specifically designed to grab | Perl programmers though. Several features match exactly. | EFreethought wrote: | And maybe Perl got it from Lisp. | | It seems like the longer I am in software development, I | find out that more and more things came from Lisp. | mtlmtlmtlmtl wrote: | Lisp is perfect for one man projects, personal tooling, | templating for languages you prefer not to write, etc. | | To me it's more of a programmer's swiss army knife than a | language I'd use in a big project that needs to be accessible | to a larger team. | [deleted] | submeta wrote: | Individuals who are particularly passionate about LISP may | attempt to persuade others that it is superior to other | languages, despite the fact that many have moved on to more | practical programming languages. | | I can get it, Lisp has some value. Acquiring proficiency in it | can be likened to studying Latin. Though it may be considered an | obsolete language, it has a significant historical impact as it | has served as a foundational influence for many modern languages. | However, ultimately, it may not be considered as practical of a | choice compared to more widely-used contemporary languages. | | Edit: I am tempted to compare Lispers to religious zealots. | Especially Emacs lovers. I was in that camp as well. In the end I | realized there was a tradeoff between tinkering and doing. | Emacsers love to tinker. | dang wrote: | Please don't start programming language flamewars. We (and | Lisp!) had enough of those a long time ago, and part of the | idea of HN is to avoid this kind of thing. | | https://news.ycombinator.com/newsguidelines.html | [deleted] | stassats wrote: | What drives people to attempt to persuade others that Lisp is | not practical? | kaveh808 wrote: | Regarding the question of "Why [Common] Lisp?"... | | I did early Lisp development on Symbolics Lisp Machines back in | the day. Wrote 3D graphics on them. I didn't realize how special | the development environment was until I got my first job, writing | 3D graphics in Fortran on VAX/VMS. Spent the rest of my career | (Fortran, C, C++, IRIX, Linux) bemoaning all the stuff I missed | from my Lisp days. | | I did venture back into Common Lisp development (MCL/CCL on | MacOS) for my personal projects. Even did my masters thesis in CL | by writing a socket connection to Maya and using it as a graphics | engine from CCL. | | It took me a long time (decades) to get over the "everyone should | be using CL" mentality. | | Thinking back on things, I have come to realize that Lisp is not | a magic bullet: it won't necessarily make you a better | programmer, and it won't necessarily make your project more | successful. | | What Lisp will do is give your developers more power at their | fingertips. For better or worse. | | The philosophy behind Lisp (and Smalltalk) back in the 70's and | 80's was that programmers should be given as much expressive | power as possible so they can develop better, faster, etc. The | reason why CL allows you to define macros, redefine classes and | methods on the fly, use generic functions and multiple | inheritance, and recover from errors, is simply that the language | designers considered these import enough to do the hard work to | make them happen. | | I feel that philosophy, backed by the economics of software | development, fell out of favor over time. Performance, safety | (preventing developers from shooting themselves in the foot), | code maintenance by large teams, cost, etc became more important. | | Today, the main factors in language choice are (1) the | availability of developers, and (2) the availability of | libraries/tooling. Going against these currents requires | awareness and a strong commitment. To paraphrase an old computer | industry saying: no one got fired for choosing Java. | | On a personal note, I continue to use CL for my own projects, | where the pleasure of development is more important to me than | commercial considerations. I have done so for kons-9, my 3D | graphics system, and am happy that I did so. I simply would not | have been interested in doing the project in C++. I find that CL | is a language which supports me in my development, rather than | fighting back. | | As an added bonus, the features of CL have encouraged me to think | differently about the architecture and design of the system. A | system built in C++ would simply have converged towards being | another Maya/Houdini/Blender (at best, after many years of | development). This way, I have a chance to do something | different, which is a big part of the fun. | robomartin wrote: | I used LISP and APL professionally for, in the aggregate, over | ten years. My current opinion on these languages is that software | engineers would benefit greatly from learning and understanding | them, yet it would be a mistake to use them for any modern work. | | When I say "learning" I mean in-depth application over, perhaps, | a year, not something superficial. The question is how. I don't | really have an answer for that. You have to find reasonably | complex projects to be able to spend that much time with a | language. That's the problem. I was getting paid to use these | languages back then. Who wants to do non-trivial work in these | languages today. Not many. | mark_l_watson wrote: | From just reading the TOC, and the first bit, this looks great. | Like the author, I have been into Common Lisp "forever." I do | sometimes feel conflicted when I can get something done in Python | much faster because I can find a library that solves the problem | I am working on. Probably my most honest advice to people is that | Common Lisp is very good for research programming, but for many | use cases other programming languages are better. | yourapostasy wrote: | _> ...because I can find a library that solves the problem I am | working on._ | | I couldn't find it, but is there a "Rosetta Stone" of language | ecosystems, where in a "libraries" section it lists | Python/Go/Rust/Ruby/Perl/Lisp/ _etc._ library near-equivalents? | tmtvl wrote: | I don't recall ever coming across one of those, it may be a | neat idea to set that up. | tombert wrote: | This is why I've found myself doing Clojure for everything. | Clojure has its own pretty-ok ecosystem, but also benefits from | the Java ecosystem, while still giving me some lispey goodness. | | Granted, sometimes the mixing of paradigms can kind of clash, | and that's its own can of worms, but at least I never get that | "ugh I could have done this with a library in <language X>" | mmcdermott wrote: | When I reference Java from Clojure, I usually wind up with a | thin layer of wrappers around the part of the library I need | to make the main codebase feel more properly Lispy. It isn't | perfect with the different mental models between the | languages, but it helps. | tombert wrote: | Yeah, and I think wrapper functions are fine and normal. | | The part that I do find annoying is when I have to break | out macros to make my wrapper usable. When I was using the | Java bindings for Apache Spark a few years ago, I felt like | I was constantly reaching for macros to do some clever | stuff, which is no fun. | martinflack wrote: | > I can get something done in Python much faster | | Take a look at the CL libraries PY4CL, PY4CL2, and CL4PY. I use | the first one for some things. It can be useful to bridge over | to Python for something and come back with the answer. | mark_l_watson wrote: | Thanks, I have been using py4cl for a year or two. I have an | example in my Common Lisp book that you can read online: | https://markwatson-com-website.pages.dev/books/lovinglisp- | si... | seanw444 wrote: | Yeah I haven't found any project I've wanted to implement in | CL. I usually end up using Python or Go at that level of | abstraction. If I want lower-level, C or Rust. However, I | interact with Lisp almost daily through Emacs. And I enjoy it | quite a bit. Configuring my editor through Lisp is unusually | satisfying, and feels sleek. | tromp wrote: | > The biggest secret to Lisp is that it is actually the simplest | programming language ever created---and that, coupled with its | expressiveness and elegance, is why it is favored exclusively by | the best programmers in the world. | | This is clearly a very opinionated book. Personally I find | Haskell, while perhaps not as simple, both more expressive and | more elegant. But I don't imagine it is favored by the worlds | best programmers. | [deleted] | dang wrote: | Related: | | _Learn Lisp the Hard Way_ - | https://news.ycombinator.com/item?id=8573389 - Nov 2014 (32 | comments) | | _Learn Lisp the Hard Way_ - | https://news.ycombinator.com/item?id=8016950 - July 2014 (141 | comments) | revskill wrote: | The problem with almost all LISP tutorials, books,... is there's | no guide on how to install toolings at the beginning. Instead, | there's just praise and praise. | | Such a missed opportunity. | rjsw wrote: | There is a section of the Preface on "Configuring Your | Development Environment", seems pretty complete to me. | revskill wrote: | Preface section as i see is applied for whom who already get | used to LISP. | | If audience is whom who doesn't know anything about LISP, | you've lost time to go around to find things you want. | | Other languages have playground, or at least INSTALLING at | the chapter 1. It should answer some IMPORTANT questions: | | - How to install the compiler | | - Which IDE best to use, or which extension. | | - How to install packages, how to build it. | lilith_of_debts wrote: | https://llthw.common-lisp.dev/configuration.html | | Literally everything you're asking for is in that link. The | author has the opinion that you don't need fancy IDE | features which is an arguable point but they do list what | editors for each OS work in their experience. | Mikeb85 wrote: | Nowadays it's pretty much as simple as installing SBCL and then | Emacs-Slime. | nerdponx wrote: | Unless you don't want to use Emacs, which is completely | understandable. I know SLIME is great but we really shouldn't | force Emacs on people. | nequo wrote: | Emacs is also great though. For all intents and purposes, | with evil mode it can act as just another implementation of | Vim.[1] | | But for those who like neither Emacs nor Vim ... I don't | know. | | [1] https://github.com/emacs-evil/evil | ratzkewatzke wrote: | I'm an Emacs partisan, but the VSCode support for Common | Lisp has come along way. Interested parties might look at h | ttps://marketplace.visualstudio.com/items?itemName=rheller. | ... . | [deleted] | beepbooptheory wrote: | Curious to know how big the cross section of people is that | are ready/eager for CL, but don't want to touch Emacs. I | think its rather nice this might act as a screen, they are | both tied together, even if mostly spiritually now. | | In general though, I'd say switch your focus to Scheme, and | use Dr.Racket, if you really really don't want to use | Emacs. | tmtvl wrote: | Or use SLIMA (https://github.com/neil-lindquist/SLIMA) | with Atom... oh, right, moment of silence... | | ...SLIMA may work with Pulsar, or if you prefer Eclipse | there's Dandelion | (https://github.com/Ragnaroek/dandelion). | | VSCodium may be able to use Alive, but as it can't fully | turn off MS's spyware I can't in good faith recommend it. | nerdponx wrote: | There's Slyblime for the Sublime Text users: | https://github.com/s-clerc/slyblime. Worked pretty well | when I tried it. | franknstein wrote: | "Clojure for brave and true" has in my opinion an excellent | section on Clojure tooling in emacs (which I wish i read when I | was starting out with emacs). | WillPostForFood wrote: | It is a strength (they do cover tooling), but also a | weakness. Throwing beginners into learning emacs, as well as | a new language, and likely a new programming paradigm, is a | massive ask. I think it is mistake for Clojure that Brave and | True is the most recommended book to start out. | dockleaves wrote: | That is interesting. I am wondering though, in what areas does | Lisp get used these days? | | What would be a good project to showcase the strengths of Lisp, | versus other well-known languages? | | How/why do people end up learning Lisp, what is the usual route | to entry? | | Genuine questions, not trying to start a language battle here. | I've never used Lisp before so am curious about all of this. To | me it feels like one of those exotic old-school languages like | Erlang or Perl. | tmtvl wrote: | So I've been using Scheme for a couple of years now and really | enjoying proper interactive development (why would I recompile | my entire program to run the tests when I can just run the | tests whenever I feel like?) and I was fairly happy with it, | though I'm always very aware that using less power/time | efficient languages is harmful to the environment. So I decided | to give Common Lisp a try after repeatedly hearing that it's | faster than Scheme and I wound up falling in love with its | support for type checking (well, with SBCL's support for type | checking). | | Now I have my interactive programming with the nicety of having | SBCL warn me when I'm passing an integer to a function that | expects a string or something like that. Not only does it help | me make fewer mistakes while programming, the type declarations | also help SBCL generate more efficient code. It's a win-win all | around. | fm2606 wrote: | >> How/why do people end up learning Lisp, what is the usual | route to entry? | | I started learning CL starting around July/Aug 2022. How I got | here is close to 2 years ago I read a blog post (I think) that | said learning a niche language can help land a high paying | part-time job, or, if applying to a position where said niche | language is used you don't have to jump through all the Leet | code, typical interview circus. Just knowing the language and | having an interest was a huge factor in getting hired. It | seemed fairly plausible to me. | | Initially I started learning Clojure but kept reading stuff | about how awesome CL was/is. The JVM kind of turned me off and | I like compiled, stand alone applications which can be had in | CL. | | So here I am really enjoying learning CL. I am in a | job/organization that does not use CL and probably never will. | The benefits are awesome so I have no plans on leaving anytime | soon. Maybe one day I may try to land a part time job using CL | but I'm no where ready for that (both in my lack of CL | knowledge and lack of time to commit to a part time job). | gleenn wrote: | We use Clojure for large data processing where it shines. It's | also good at doing concurrency with it's solid concurrency | tools and immutability by default. So a lot of people use it | for financial data, fraud, and big data stuff. I think it's | less common, but using Re-frame both in a front-end web app and | also in a React Native mobile app was a charm. Some of the | environments were a little hard to get going but were a dream | to poke around and add lots of features quick. For example, the | whole Urban Dictionary native app for iOS and Android are in | Clojure as well as most of the site. | wwfn wrote: | I'm also very curious for hear from expert lispers. I've tried | to find the sweat spot where lisp would fit better than what I | already know: shell for glue and file ops, R for data munging | and vis, python to not reinvent things, perl/core-utils for one | liners. But before I can find the niche, I get turned off by | the amount of ceremony -- or maybe just how different the state | and edit/evaluate loop is. | | I'm holding onto some things that make common lisp look | exciting and useful (static typing[0], APL DSL[1], speed | [2,3,4]) and really want to get familiar with structural | editing [5] | | [0] https://github.com/phantomics/april [1] | https://github.com/coalton-lang/coalton/ [2] | https://renato.athaydes.com/posts/revisiting-prechelt-paper-... | [3] https://github.com/fukamachi/woo/blob/master/benchmark.md | [4] https://tapoueh.org/blog/2014/05/why-is-pgloader-so-much- | fas... [5] https://github.com/drym-org/symex.el | TacticalCoder wrote: | > I am wondering though, in what areas does Lisp get used these | days? | | If you consider Clojure a Lisp then I think before the tech | stocks crashed there were seven unicorns built with Clojure. | Banking, healthcare, analytics, ... | | I'd say Clojure can be used anywhere Java can for sure. And | Clojure runs on top of ClojureScript too. | | Then Clojure is only one of the Lisp dialects and there are | "lispier lisps" out there which also their success stories. | jimbokun wrote: | Interesting 5 of those unicorns are listed here: | | https://clojure.org/news/2021/08/13/deref | srejk wrote: | I read the little LISPer (now the little SCHEMEr) years ago, I | found that was a great way to teach recursion. ___________________________________________________________________ (page generated 2023-01-10 23:00 UTC)