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.

Reply via email to