簡體   English   中英

Clojure:使用宏或def的函數參數/簽名

[英]Clojure: function arguments/signatures using macro or def

我有很多功能都具有相同的長簽名(為簡單起見,在此省略):

(defn f 
      [x & {:keys [a b c d e f g h]
            :or [a false b false c false d false e false f false g false h false]}]
      a)

我希望使用宏,函數甚至def來預先存儲此通用簽名:

(def args `[a b c d e f g h])

(defn args [] `[a b c d e f g h])

(defmacro args [] `[a b c d e f g h])

但是所有這些,當我插入

(defn f 
      [x & {:keys (args)
            :or [a false b false c false d false e false f false g false h false]}]
      a) 

最終出現類似的錯誤

CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(NO_SOURCE_PATH:1) 

所以我的兩個問題是:

  1. 有什么方法可以定義和使用這樣的通用args

  2. 如果可以定義這樣的args ,我也想減少它以獲取:or參數: [a false b false c false d false e false f false g false h false] 怎么做? (我是在問一個args定義是否很奇怪,以至於不再簡單易懂。)

問題是defn的參數向量中的defn沒有得到評估。 但是,您可以定義自己的defn版本,如下所示:

user=> (defmacro mydefn [name & body] `(defn ~name ~'[a b c] ~@body))
#'user/mydefn
user=> (mydefn f (+ a b))
#'user/f
user=> (f 1 2 4)
3

注意參數需要~' 否則,語法引號( ` )會將符號限定為user.a等。

暫無
暫無

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

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