This is another Friday social topic. You are aimlessly wandering around a beautiful hilltop by a sea when an angel approaches you from the opposite direction. She is no ordinary angel. She is a Lisp angel! She will grant one Lisp wish to you. Before she can fulfill your wish, she needs this information from you:
- Your favorite Lisp dialect.
- Your favorite non-Lisp programming language.
- Your favorite standard library function/macro/feature from your favorite Lisp dialect that you want to see in your favorite non-Lisp programming language.
Once you tell these 3 things to the angel, she will magically add your chosen feature to your chosen non-Lisp programming language.
What are your answers going to be?
- “favorite Lisp dialect”: Scheme (Guile, Gambit, and MIT/GNU)
- “favorite non-Lisp programming language”: Haskell
- “favorite standard library function/macro/feature”: homoiconicity, i.e. both code syntax and data structures built from S-expression, which makes features like
syntax-case
feature possible, and the ability to implement declarative domain specific languages with Haskell-like type checking on large parts of your program at compile time. If every language would like this, my life would be soooo much easier and less stressful.
One thing I hate about other languages is complicated syntax that makes it difficult or impossible to do macro-programming. S-expressions are a minimalist syntax that allows lisp to be well-adapted to most any use case, and features like defmacro
or syntax-case
are very well designed mechanisms for doing exactly that. Other languages like Python and JavaScript have macro-programming implementations but they are so hacky and not very well designed compared to most Lisps, which have the feature built right into the language.
- Scheme
- Zig
- (let loop ((…)) (cond …))
I love how recursive looping reads and unfortunately there aren’t many languages implementing this approach.
- Common Lisp
- Haskell I guess
defmacro
. This would probably involve changing the syntax to list form like axel does.