[英]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)
所以我的兩個問題是:
有什么方法可以定義和使用這樣的通用args
?
如果可以定義這樣的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.