Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure强制关键字参数_Clojure_Keyword Argument - Fatal编程技术网

Clojure强制关键字参数

Clojure强制关键字参数,clojure,keyword-argument,Clojure,Keyword Argument,我有这样一个函数: (defn foo [{a :keya b :keyb}] (list a b)) (foo {:keya "hi"}) ; Returns ("hi" nil) 我这样称呼它: (defn foo [{a :keya b :keyb}] (list a b)) (foo {:keya "hi"}) ; Returns ("hi" nil) 如果我不给出keyb关键字参数,那么它需要nil。是否有一种方法可以确保它为其抛出异常,而不是将其视为nil (我知道我

我有这样一个函数:

(defn foo [{a :keya b :keyb}]
  (list a b))
(foo {:keya "hi"}) ; Returns ("hi" nil)
我这样称呼它:

(defn foo [{a :keya b :keyb}]
  (list a b))
(foo {:keya "hi"}) ; Returns ("hi" nil)
如果我不给出
keyb
关键字参数,那么它需要nil。是否有一种方法可以确保它为其抛出异常,而不是将其视为nil


(我知道我可以手动检查并引发异常,但是否有任何特殊选项可以强制约束。)

您可以使用前提条件()断言密钥存在:

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

当键为nil时,这将抛出断言错误。

否,但当然,因为Clojure是一个lisp,您可以定义自己的宏来自动处理枯燥的“手动检查”。

如果您想要更复杂的内容,请查看或为您提供了正确的解决方案,但
{: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))