簡體   English   中英

Clojure關鍵字參數

[英]Clojure keyword arguments

在Common Lisp中你可以這樣做:

(defun foo (bar &key baz quux)
  (list bar baz quux))

(foo 1 :quux 3 :baz 2) ; => (1 2 3)

Clojure沒有關鍵字參數。 一種選擇是:

(defn foo [bar {:keys [baz quux]}] 
  (list bar baz quux))

(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)

這是太多的嵌套括號,必須一直打字和閱讀。 它還需要將顯式散列映射作為參數而不是平面列表傳遞。

什么是最慣用的Clojure相當於關鍵字參數,看起來沒有人引發標點炸彈?

要更新Clojure 1.2的這個答案,現在有完整的關鍵字arg支持,默認值由destruct綁定的地圖形式提供:

user> (defn foo [bar &{ :keys [baz quux] 
                        :or {baz "baz_default" quux "quux_default"}}]
         (list bar baz quux))
#'user/foo

user> (foo 1 :quux 3)
(1 "baz_default" 3)

在clojure中模擬關鍵字args的一種簡單方法是在rest參數上使用hash-map,如下所示:

> (defn kwtest [x & e] (:foo (apply hash-map e)))
#'user/kwtest
> (kwtest 12 :bar "ignored" :foo "returned")
"returned"

Rich Hickey在來自clojure google組的此消息中提供了一個宏,為您提供關鍵字參數。 相應的線程包含有關clojure不支持關鍵字參數的原因的信息。 基本上是為了避免運行時開銷。 Rich在本消息中解釋了我在上面顯示的方法

clojure.contrib.def的最新成員是defnk宏,它允許使用關鍵字參數定義函數(參見此處 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM