What makes lisp special?
- Rondam Ramblings: Yes, code is data, but that’s not what makes Lisp cool [2018]
- What Made Lisp Different; Paul Graham [2002].
- How Lisp Became God’s Own Programming Language; Oct 2018 by Sinclair Target at Two-Bit History.
Starting to code in Common Lisp
-
Articulate Common Lisp — How to write Common Lisp in 2018 - an initiation manual for the uninitiated.
-
A Road to Common Lisp / Steve Losh; Aug 2018
-
Starting a minimal Common Lisp project | notes.eatonphil.com; Mar 2018.
-
How I got started with Common Lisp in 2017; Sep 2017 — this one uses roswell, compares different editors (atom, emacs-bare/prelude and portacle), explains a bit how asdf and directory structure works etc., useful.
CL-References
- CLHS: Permuted Symbol Index (I)
- Lisp Machine Manual 1984 by Moon, Stallman and Weinreb.
- Simplified Common Lisp reference — appears to be not complete, but interesting presentation.
Other Lisps
- fogus: The German School of Lisp
- Lumen — Right! I’ve been waiting a couple years for Lumen to get some traction. | Hacker News — wherein user
shawn
shows off the cool things you can do with Lumen Lisp. Reference to Ken Thompson’s “Trusting Trust” paper. - Lush: Lisp Universal SHell
- uLisp is a Lisp for microcontrollers (Arduino ATmega, Adafruit, BBC MicroBit, STM32, ESP8266 and MSP430 based Launchpad boards).
- GameLisp — a scripting language (lisp) for Rust game development.
- The Many Faces of an Undying Programming Language — Jakob’s Personal Webpage; Jul 2020.
- Lush: my favorite small programming language | Locklin on science
T
- The T Project “T was one of the best Lisp implementations, and set a standard for clean design that few newer dialects have been able to meet.” — Olin Shivers History of T.
- Orbit paper (pdf) by Jonathan Rees
Urn
Urn is a Lisp that compiles to Lua. Its tutorial is one of the friendliest to learn Lisp itslef.
Picolisp
uLisp
- uLisp — Lisp for Arduino, Adafruit M4, Micro Bit, ESP8266/ESP32, and MSP430 boards.
Notes
To add readline support to the SBCL REPL, use rlwrap
Use quicklisp
to discover, install and manager Lisp libraries
Starting SBCL with QuickLisp pre-loaded.
$ rlwrap sbcl --load ~/quicklisp/setup.lisp
Quotes
In C, you are writing assembly constructs disguised as a high level language. In lisp, you are writing compiler constructs (abstract syntax trees) disguised as a high level language. Assembly language targets hardware-oriented geeks. Lisp targets compiler-oriented geeks. Since the two don’t (generally) understand the other’s viewpoint, each hates the other’s favorite language.
— gvb at i hate lisp.
Implement your own Lisp
- Build your own Lisp
- mal: make a lisp in multiple languages.
- Lisp in a few lines of Haskell by Ben Lynn at CS.Stanford.
- krig/LISP: My attempt at implementing the original LISP paper while learning lisp. Nothing special, mostly posted as a homage to McCarthy.
Links
- These years in Common Lisp: 2018 – Vince Zd – Medium
- Lisp and DSLs
- Classic Lisp books
- Writing a Common Lisp Web App in caveman2. Blog written in CL Source
- LispOS: Specification of a Lisp Operating System” (Robert Strandh, 2013) (PDF).
- Discussion on Lisp
- Adam Tornhill’s Programming Pages
- uLisp - Lisp for the arduino
- L-99: Ninety-Nine Lisp Problems
- Pascal Costanza’s Highly Opinionated Guide to Lisp
Blogs
-
Borretti — Articles. See State of the Common Lisp Ecosystem, 2015
-
stablecross.com lisp articles. See The Myth of the Super Programming Language?
-
Lisp journey. See Introducing Replic: an executable and a library to build a readline app in no time - Lisp journey / State of Common Lisp Web Development - an overview - Lisp journey
Videos
- Baggers’ Little bits of Lisp (shorter videos, few minutes each).
- Baggers’ Lots of bits of Lisp (longer videos 1-2 hour).
Algorithms
- Lisp, the Universe and Everything: “Programming Algorithms” Book [WIP book]; Jul 2019.
Lisp Machines
Books
- norvig/paip-lisp: Lisp code for the textbook “Paradigms of Artificial Intelligence Programming” (Also contains PDF of the book).
- Land of Lisp: Learn to Program in Lisp, One Game at a Time!
- Practical Common Lisp (free book)
- On Lisp by Paul Graham (free book)
- Lisp Outside the Box; partially completed; original plan
- Full stack Lisp; develop web applications (hence the “fullstack”) using Common Lisp. [Work in progress]
- マンガで分かるLisp(Manga Guide to Lisp) in Japanese-u.
IDEs
The de-facto IDE for most lisps in Emacs. Howver Portacle - A Portable Common Lisp Development Environment is a good, ready-to-go, purpose-built distribution of Eamcs for use on Windows, Mac and Linux.
Talks
People
- dlweinreb’s comments | Hacker News ; Daniel Weinreb passed away in 2012.
- Fernando Borretti
- 40ants — “are a group of Lisp hackers. Our goal is to extend Common Lisp’s ecosystem and to solve realworld problems using the most powerful programming language.”
Implementations
- SBCL
- ABCL
- CCL
- Corman Lisp (windows only)
- Allego CL
- Lispworks
- jscl: A Lisp-to-Javascript compiler bootstrapped from Common Lisp
Distributions
- quicklisp
- ultralisp.org/ — bleeding edge quicklisp
Interesting programs / libraries
- https://github.com/Shinmera/beamer slide show program based on trial game engine. Example slide from ELS 2018.
Tips
lisp tip: run visual programs with (uiop:run-program '("sudo" "htop") :output :interactive :input :interactive)
works for sudo, vim, htop, ncdu
… see also (cmd:cmd "sudo htop" :<> :interactive)
Discussions/ Comparisons
-
Outperforming everything with anything. Python? Sure, why not? : programming … has some discussions on Common Lisp and CLASP.
-
Dynamic language compilation discussion, many interesting points about Common Lisp and AOT; Apr 2019.
-
Why lisp over Julia (HN).
Understanding the words “package”, “system”, “project” .. which have different meanings than commonly understood ones.. As explained by sjl
on lobste.rs:
Common Lisp’s terminology is confusing because it’s old and uses a lot of words that we use now (like “package”) to mean different things than people mean today. Things get easier once you internalize what Common Lisp means by the terms.
A package in Common Lisp is a container for symbols. They’re a way to group related names (symbols) together so you don’t have to do the miserable prefixing of every name with
mylibrary-...
like you do in Emacs Lisp or C to avoid name clashes.Unlike other languages like Python/Clojure/etc, packages and files on the hard disk are not tied strongly together in Common Lisp. You can have several files that all work with the same package, a single file that switches back and forth between packages, or even write code that creates/mutates packages at runtime. Files and packages are orthogonal in Common Lisp, which gives you maximum flexibility to work however you want.
A system in Common Lisp is a collection of code (mostly) and a description of how to load that code (and some metadata like author, license, version, etc). For example: my directed graph library
cl-digraph
contains a system calledcl-digraph
. That system has a description of how to load the code, and that description lives in thecl-digraph.asd
file. It creates a Common Lisp package (calleddigraph
).The Common Lisp language itself has no knowledge of systems. ASDF is a Common Lisp library bundled with most (all?) modern implementations that handles defining/loading systems. (The name stands for Another System Definition Facility, so as you might guess there have been several other such libraries. ASDF is the one everyone uses today.)
Systems and packages are orthogonal in Common Lisp. Some systems (like small libraries) will define exactly one package. Some systems will define multiple packages. Rarely a system might not define any new packages, but will use or add to an existing one.
A project in Common Lisp is not an official term defined anywhere that I know of, but is generally used to mean something like a library, a framework, an application, etc. It will usually define at least one system, because systems are where you define how to load the code, and if it didn’t define a system how would you know how to load the code? My
cl-digraph
library mentioned above is a project that defines three systems:
cl-digraph
which contains the actual data structure and interface.cl-digraph.test
which contains the unit tests. This is a separate system because it lets users load the main code without also having to load the unit test framework if they’re not going to be running the tests.cl-digraph.dot
which contains code for drawing the directed graphs with Graphviz. This is a separate system because it lets users load the main code without also having to load thecl-dot
system (the graphviz bindings) if they don’t care about drawing.If I were writing this today I’d use ASDF’s
foo/bar
system naming notation instead of separating the names with a dot, because there’s some nice extra support for that. I just didn’t know about it at the time, and don’t want to break backwards compatibility now.We saw how Common Lisp has no concept of a system — that comes from ASDF. Similarly, ASDF has no concept of the internet, or reaching out to somewhere to download things. It assumes you have somehow acquired the systems you want to load, maybe by sending a check to an address and receiving a copy of the code on floppy disk, as many of my old Lisp books offer in the back pages.
Quicklisp is another library that works on top of ASDF to provide the “download projects from the internet automatically if necessary” functionality that people want in our modern world. So when you say
(ql:quickload :cl-digraph)
you’re asking Quicklisp to downloadcl-digraph
(and any dependencies) if necessary, and then hand it off to ASDF to actually load the code of thecl-digraph
system. Unlike ASDF, Quicklisp is relatively new in the Common Lisp world (it’s only about eight years old) bundled with any modern Lisp implementations (that I know of) (yet?), which is why you need to install it separately.So to summarize:
- Files are files on your hard drive.
- Packages are containers of symbols. They are orthogonal to files.
- Systems are collections of code, plus instructions on how to load this code. They are orthogonal to packages.
- Projects are high-level collections of… “stuff” (code, documentation, maybe some image assets, etc). They are (mostly) orthogonal to systems (seeing a trend here?).
- Common Lisp knows about files and packages. ASDF adds systems. Quicklisp adds the internet.
This is a pretty high-level view that glosses over a lot, but maybe it’ll clear things up and help you dive into the details later.