If you have assertions enabled, you can declare
(defn foo [a b & {:keys [c d]}] {:pre [c d]} 1) to make sure that c and d are not nil (defn foo [a b & {:keys [c d] :as m}] {:pre [(every? m [:c :d]]} 1) to make sure that c and d are contained and (defn foo [a b & {:keys [c d] :as m}] {:pre [(zero? (count (dissoc m :c :d)))]} 1) to make sure that m contains only :c and :d It will only complain at run-time but at least it will complain. On Sunday, August 23, 2015 at 1:34:11 AM UTC+2, Dave Tenny wrote: > > 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 > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.