I've been reading http://subjectivelisp.org/wiki/Differences_with_Nu and noticed that your definition of let permits multiple variables. I'm curious if you considered the use case of destructured binding:
Only supports a single variable currently, though it would be cool to support multiple:
w/each x = {1 2 3}
prn x
Nulan's macro system is not only hygienic, but it plays very nicely with customizable syntax too, as you can see in the definition of "w/each":
$mac w/each -> {('=) x y} body
w/uniq i len
w/complex y
'w/var len = y.length
for (var i = 0) (i ~= len) (++ i)
w/var x = y[i]
body
And a couple more examples:
# Simulating a `for` loop using a `while` loop
$mac for -> init test incr body
'| init
| while test
| body
| incr
for (var i = 0) (i < 10) (++ i)
prn i
# Simulating a `do..while` loop using a `while` loop
$mac do -> body {('while) test}
'while %t
| body
| if ~ test
&break;
var i = 0
do
| prn i
| ++ i
while (i < 10)
P.S. Sorry for hijacking the thread, but I've been itching to talk about Nulan, since I've made so much progress on it (as shown by the many commits on Github).