I sure wish Clojure would generate "IllegalArgumentException" in the following sample case:
(defn foo [a b & {:keys [c d]}] 1)
(foo 1 2 :e 5) ; blithely ignores :e 5
I understand that Clojure's destructuring things are very nice, and more powerful than Common Lisp's, and I like
that when I need it.
However I can't tell you how many times I've been bitten by this. Some simple typo or other other parameter name error on keyword arguments
with untended and way-too-long-to-debug consequences.
In my mind, on this subject, Common Lisp lambda lists got this right and Clojure gets a poor grade.
Something about being doomed to repeat history. In Common Lisp, if you really wanted to allow other (arbitrary) keywords you'd
just use &allow-other-keys.
Maybe clojure should only allow the above case to go un-complained-about if :as was specified for the map.
If there's some automatic enforcement I'm missing that comes with 'defn' please let me know, I'm still learning the language.
I've thought more that once about making a common lisp DEFUN statement that maps to DEFN but implements
lambda list semantics (including 'supplied-p' parameters). I've just been too lazy to do it.
It would also likely perform poorly after injecting the additional checks/rearrangements into the function on top of what Clojure has already done,
so I suppose it would have to be taken a step further so that it didn't generate DEFN expressions at all but was implemented at DEFN's level as
a seperately named form.
Tips welcome. Just thinking aloud.
- Dave