2013-06-29 30 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))