Proper let Syntax
Most of the basic features of Erie are working, but I am still missing let
bindings. I looked for inspiration in the syntax of other Lisps and found a couple of options. Common Lisp and Racket are techincally the same because Racket treats []
as ()
, but I included both because Racket often uses []
to make certain forms stand out.
None of the styles strike me as particularly better. Clojure has fewer characters, but I like the way CL and Racket group the binding and the value more explicitly.
Clojure
(let [a 1 b 2]
(+ a b))
Common Lisp
(let ((a 1) (b 2))
(+ a b))
Racket
(let ([a 1]
[b 2])
(+ a b))
Regardless of the syntax, implmenting let
should be straight forward. Erlang Abstract Format supports match
which is very similar. In Elixir
x = 42
is represented as
{:match, 1, {:var, 1, :x}, {:integer, 1, 42}}
in EAF and could be used to represent let
bindings.
But before implementing that, I found this answer on StackOverflow and it revealed a new way to look at let
. To sum it up, let
doesn’t need to be implemented in the compiler. It can be a macro that converts its forms into a tree of nested lambdas. (Samples are using the currently proposed Erie let
syntax.)
(let
[a 1]
[b 2]
(+ a b))
is equivalent to
((lambda [a]
((lambda [b]
(+ a b)) 2)) 1)
So instead of adding let
as a feature in the compiler, I’ll save the syntax decision for when macros are implemented.