They all have a lot in common:
- Dynamic languages
- Strongly typed
- Compiled
- Lisp-style syntax, i.e. code is written as a Lisp data structures (forms) with the most common pattern being function calls like:
(function-name arg1 arg2)
- Powerful macro systems that allow you to treat code as data and generate arbitrary code at runtime (often used to either “extend the language” with new syntax or create DSLs)
- Often used in functional programming style, although have the ability to accommodate other paradigms
- Emphasis in interactive development with a REPL (i.e. you interactively develop in a running instance of the code)
Common Lisp distinctive features:
- A powerful OOP subsystem (Common Lisp Object System)
- Probably the best compiler (Common Lisp is the fastest Lisp according to http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html although there isn’t much in it…..)
Clojure distinctive features:
- Largest library ecosystem, since you can directly use any Java libraries
- Vectors
[]
and maps{}
used as standard in addition to the standard lists()
– in addition to the general usefullness of vectors and maps some believe this is a innovation which makes generally more readable - Greater emphasis on immutability and lazy functional programming, somewhat inspired by Haskell
- Strong concurrency capabilities supported by software transactional memory at the language level (worth watching: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey)
Scheme distinctive features:
- Arguably the simplest and easiest to learn Lisp
- Hygienic macros (see http://en.wikipedia.org/wiki/Hygienic_macro) – elegantly avoids the problems with accidental symbol capture in macro expansions