On Jan 30, 3:18 am, Robert McIntyre <r...@mit.edu> wrote:
> I see, so you wanted to allow some subset of the optional arguments.
>
> Might I recommend the following?
> Sets are already functions that check for inclusion of the objects on
> which you call them, so instead of (contains? some-set ele) just
> (some-set ele) will work.  Also, upon actually making a typo you just
> get the statement that (contains? #{:a :b} each) has failed, while I
> think it would be nicer if it actually showed the offending misspelled
> keyword. Unfortunately implementing this proved harder than I expected
> and the best I could come up with was:
>
> (defn hello
>   [& {:keys [a b] :as input}]
>   (dorun (map #(eval `(assert (#{:a :b} (quote ~%))))
>               (keys input)))
>   "hello")
>
> I'd be curious what the right way to to this is.

The version I have meanwhile come up with is this:

(defn verify-opt
  "Verify that the optional arguments (keys) are from a known set of
keywords."
  [known-coll input-coll]
  (let [known-set (if (set? known-coll) known-coll
                    (into #{} known-coll))]
    (doseq [each (if (map? input-coll)
                   (keys input-coll)
                   input-coll)]
      (when-not (known-set each)
        (throw (IllegalArgumentException.
                 (format "Invalid optional argument key %s, Allowed
keys: %s"
                   each
                   (with-out-str (pp/pprint known-set)))))))))

And to use this:

(defn hello
  [& {:keys [a b] :as input}]
  (verify-opt #{:a :b} input)
  "hello")

The eval bit is succinct - I will try that out.

Regards,
Shantanu

-- 
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

Reply via email to