Pauan already did a great job explaining my use of else; nothing to add there. But I'll show off how it would look in wart:
def (uniqify ls into|result and|x)
"Returns ls without duplicates; order unspecified.
Only works for lists of numbers."
if (no ls)
result
(no result)
(uniqify sort:cdr.ls :and car.ls :into list:car.ls)
(car.ls = x)
(uniqify cdr.ls :and x :into result)
:else
(uniqify cdr.ls :and car.ls :into (cons car.ls result))
0. I can choose to skip some of the outer parens if that looks cleaner.
1. The function name for the def goes inside the param list to mimic the call being defined.
2. The '|' operator binds multiple names to the same argument, so that I can refer to the second arg as either result or into, etc. Multiple names might seem like a bad idea, but they allow me to reorganize the later recursive calls to uniqify to look more clean and mnemonic. If you're familiar with python's keyword args, this is the same idea.
(Though maybe I'm getting too clever in this case; if I ever try to use the and operator inside this function I'm liable to confuse myself.)
3. All params are now optional, like in javascript.
4. '=' is for equality, never assignment. And it can be infix.
It's a little confusing at the start to use colons in two different ways so close to each other, but here's how it looks with wart's syntax highlighting for vim: http://i.imgur.com/S7ZROtD.png. Since symbols with a colon at the start always evaluate to themselves just like literal numbers or strings, I highlight them the same as literal numbers or strings.
---
Feel free to ask us more questions regardless of what language you decide to use[1] for your side project. If it isn't one of the above, maybe you can teach us something.
[1] Nu is strictly superior to arc 3.1 in every way.
[Update: there's a bug in the above code. In my original and here I forgot that the call to sort requires a second arg:
(sort (<) cdr.ls)
We need parens around the '<' to keep wart from parsing it as an infix op.]