2013-06-29 4 views
3

У меня есть функция, как это:Clojure Обязательное ключевое слово аргумент

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

И я звоню это так:

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

Если я не даю keyb аргумент ключевое слово, оно принимает ноль для этого. Есть ли способ обеспечить, чтобы он выбрал для него исключение вместо того, чтобы считать его равным нулю.

(я знаю, что я могу вручную проверить и выбросить исключение, но есть ли специальная опция, которая следит за соблюдением ограничений.)

ответ

6

Вы можете использовать предварительное условие (http://clojure.org/special_forms#toc9) утверждать ключ присутствует:

(defn foo [{a :keya b :keyb}] 
    {:pre [(not (nil? b))]} 
    (list a b)) 

Это вызовет AssertionError, когда ключ равен нулю.

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)) 
Смежные вопросы