我有许多具有相同长签名的函数(为了简单起见,此处缩短了):
(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 来预先存储这个公共(public)签名:
(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
params:[a false b假c假d假e假f假g假h假]
。这将如何完成? (我问的是,如果args
的工作定义可能很奇怪,以至于这不再简单。)
最佳答案
问题是 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
等。
关于function - Clojure:使用宏或 def 的函数参数/签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12937420/