I'm not sure I understand your argument... aside from macros, how often do you use symbols? The only other case I can think of is using symbols as the keys of hash tables:
(= foo (obj))
(foo 'bar)
But in Nulan, hash tables use strings as keys, so that's no problem. As for your "really common list manipulation"... my system is actually better for that. Compare:
(cons a b) ; Arc 3.1
`(,a ,@b) ; Arc 3.1
(list a b c) ; Arc 3.1
`(,a ,b ,c) ; Arc 3.1
(join (list a) b (list c)) ; Arc 3.1
`(,a ,@b ,c) ; Arc 3.1
'a ,@b # Nulan
{a @b} # Nulan
'a b c # Nulan
{a b c} # Nulan
'a ,@b c # Nulan
{a @b c} # Nulan
---
"(f a b @c) looks so much nicer to me..."
I agree. Nulan supports @ splicing for both pattern matching and creating lists:
# a is the first argument
# b is everything except a and c
# c is the last argument
-> a @b c ...
# works for list destructuring too!
# this function accepts a single argument, which is a list
# a is the first element of the list
# b is everything in the list except a and c
# c is the last element of the list
-> {a @b c} ...
# in addition to working for function arguments, it also works for assignment
# a is 1
# b is {2 3 4}
# c is 5
box {a @b c} = {1 2 3 4 5}
# and of course you can nest it as much as you like
box {a {b c {d} @e}} = {1 {2 3 {4} 5 6 7}}
# equivalent to (join (list a) b (list c)) in Arc
{a @b c}
# equivalent to (apply foo bar qux) in Arc
foo bar @qux
# equivalent to (apply foo (join bar (list qux)))
foo @bar qux
---
"I.e., if (car (cdr (obj key))) returned a box, you would be able to just call '= on it, with no thought for how you found the value."
In Nulan, you could do what you're talking about, except it would all have to be done at compile-time, because boxes only exist at compile-time. In addition, you wouldn't be able to set the box directly, you would instead generate code that sets the box at run-time, i.e. macros.
Nulan has the restrictions that it does because I wanted to compile to really fast JavaScript. Other languages (like Arc) don't have that restriction, so it should be possible to design a language that has boxes at run-time, in which case your idea should work.
I actually really like symbols, and the existence of a symbol type in lisp is one of my favorite features. Technically in Nulan a 'symbol' is replaced by a 'box', and if your box had a string property called "name" that held the name of the variable they would probably be interchangeable.
Either way, I agree that your list tools are generally more useful than quote/unquote. The main things I use it for are 1) to get a literal symbol and 2) to get something like list splicing. It looks rather arcane and adds clutter though, so in most other cases I wouldn't use it.
If there was another way to just splice in a list in the middle of the code the way Nulan seems to, I might not feel as attached to it.
"I actually really like symbols, and the existence of a symbol type in lisp is one of my favorite features."
I too like symbols. But I think if you examine why you like symbols, you'll realize that you like them because... most other languages don't have a first-class way to refer to variables. But in Lisp you can, using symbols.
Well, Nulan has both symbols (representing unhygienic variables), and boxes (representing hygienic variables). It's just that hygienic variables are so much better in so many situations that there's not much reason to make it easy to create symbols in Nulan.
---
"Technically in Nulan a 'symbol' is replaced by a 'box', and if your box had a string property called "name" that held the name of the variable they would probably be interchangeable."
Yes boxes have a name property. This is currently only used when printing the box. Yes you could convert from a box to a symbol, but Nulan doesn't do this, because I haven't found a reason to.
Actually, there is ONE situation I've encountered where I would have liked to use symbols... in my playlist program, I have a list of file extensions which are considered "audio". Here's how it looks in Arc:
'(flac flv mid mkv mp3 mp4 ogg ogm wav webm wma)
In Nulan, that would have to be written like this: