2013-06-29 52 views
3

我有这样的功能:强制性的Clojure关键字参数

(defn foo [{a :keya b :keyb}] 
    (list a b)) 

我打电话这样说:

(foo {:keya "hi"}) ; Returns ("hi" nil) 

如果我不给keyb关键字参数,它需要零为了那个原因。有没有办法确保它为它抛出异常,而不是将它作为零。

(我知道我可以手动检查并抛出一个异常,但有其强制约束的任何特殊选项。)

回答

2

不,但当然,因为Clojure是一个lisp,你可以自己定义自己的宏来处理无聊的“手动检查”。

2

aldazosa更复杂的东西的样子给你正确的解决方案,但{:keya nil :keyb nil}是有效的地图了。要允许nil值,您可以使用contains?而不是nil?检查:

(defn foo [{a :keya b :keyb :as m}] 
    {:pre [(every? (partial contains? m) 
       [:keya :keyb])]} 
    (list a b))