This project aims to explore the extensive spectrum of the Lisp family of languages. Lisp is renowned for its high flexibility and great control, offering programmers a powerful toolset. However, the abundance of available options can be overwhelming, leading to choice fatigue. Therefore, this project seeks to compile essential information about the major Lisp dialects, detailing their unique features, tools, and learning resources. The project tries to provide beginner friendly guide for Lisp in general and for each dialect as well. It should be understandable and useful to the reader whether they are new to programming, with or without experience in a lisp dialect.
The Lisps we will be exploring:
[[file:common-lisp/][Common Lisp]]
[[file:scheme/][Scheme]]
[[file:clojure/][Clojure]]
Why Lisps ** Syntax Lisp has a simple syntax that can be learned in a day. All code is written as expressions, known as S-Expressions, which are lists with prefix notation. The first element is the operator, and the rest are arguments.
(+ 1 2 3 4) (list 1 2 (list 3 4)) (defun foo (a b c d) (+ a b c d))
REPL The REPL is a major selling point for Lisp, allowing for interactive, incremental program development. This feature has influenced many modern languages to offer similar interactive experiences. Code as data Lisp code has the same structure as lists, enabling the creation of macros with list-processing functions. This facilitates the development of Domain-Specific Languages (DSLs).
Lisp Resources
[[http://www-formal.stanford.edu/jmc/recursive.pdf][John McCarthy Original Paper on LISP: Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I]]
[[https://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf][Lisp 1.5 Manual]]
[[https://web.mit.edu/6.001/6.037/sicp.pdf][Book: Structure and Interpretation of Computer Programs]]
Editor Configuration ** Emacs Emacs is the de facto standard for working with Lisps. This is due to the fact that it partly written and configurable with Emacs Lisp, another lisp dialect similar to Common Lisp. For every lisp you'll find an =init.el= file that you can use as an example for a quick setup to work with each lisp in Emacs out of the box. However there are some common packages that are worth mentioning here that will make your life much easier when working with lisps in Emacs: * Structural Editing ** Paredit
[[http://danmidwood.com/content/2014/11/21/animated-paredit.html][The Animated Guide to Paredit]] **** Parinfer
[[https://shaunlebron.github.io/parinfer/][Official Website]] * UI Enhancements ** Rainbow Delimiters A UI Enhancement to auto color pairs of parenthesis
Comparison Criteria ** Installation and Setup We explore the different ways of installing every lisp such as:
The availability of official packages in different package managers.
Install from a script.
Installing from source code.
We will also look into the first time setup for every lisp.
** Resources The availability of learning resources is crucial for any programming language. We will try to gather the most helpful resources for every lisp including:
** REPL Ease and speed of interacting with the REPL, including the possibility of connecting to a remote REPL.
** Editor Integration While Emacs is the de facto standard for working with Lisps, some have their own IDEs (e.g., Dr. Racket for Racket) or support through plugins in other editors. We will explore available editor options for each Lisp.
** Package and Project management
** Standard Library and Ecosystem We will discuss the built-in libraries for each Lisp and their usability. Additionally, we will explore the ecosystem for each Lisp, including where to find and download packages.
** Performance This is very subjective as every lisp compiles to a different target(s). So, it's hard to decide whether the comparison of performance is between the lisp implementations or the target platforms.
** Interoperability with target platform(s) Most lisps offer a way of interoperability with their target platform(s) or with other platforms as well. This can differ from one lisp to another, so this won't be a comparison but rather exploring the different options.