On Sun, Jan 30, 2011 at 5:36 AM, Shantanu Kumar
<[email protected]> wrote:
> On Jan 30, 2:17 pm, Alexander Yakushev <[email protected]>
> wrote:
>> Why not use a constraint? It looks much cleaner.
>>
>> (defn hello [& {:keys [a b] :as input}]
>> {:pre [(= (set (keys input)) #{:a :b})]}
>> "hello")
Where is this documented?
> This is not the use case I was looking for (I listed it in a post
> above). Constraints are a good place to do this but not sure how to
> report the offending keyword clearly and easily using constraints --
> as in, I need to preempt 'returning false' and throw
> IllegalArgumentException with correct error message instead.
Try this version of my earlier macro:
(defmacro defkfn [name keys & body]
(let [[docstring keys body]
(if (string? keys)
[[keys] (first body) (rest body)]
[[] keys body])]
`(defn ~name ~@docstring [& {:keys ~keys :as input#}]
(doseq [k# (keys input#)]
(when-not (~(set (map (comp keyword str) keys)) k#)
(throw (IllegalArgumentException. (str "bad key " k#)))))
~@body)))
user=> (defkfn foo [a b] (+ a (* 2 b)))
#'user/foo
user=> (foo :a 2 :b 1)
4
user=> (foo :b 2 :a 1)
5
user=> (foo :b 2 :a 1 :c 3)
#<CompilerException java.lang.IllegalArgumentException: bad key :c
(NO_SOURCE_FILE:519)>
user=>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en