function - Clojure:使用宏或 def 的函数参数/签名

标签 function clojure arguments definition reduce

我有许多具有相同长签名的函数(为了简单起见,此处缩短了):

(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) 

所以我的两个问题是:

  1. 有没有办法定义和使用这样一个通用的args

  2. 如果可以定义这样的 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/

相关文章:

javascript - React js如何返回带有异步超时的div

scala - clojure在scala中迭代等效?

clojure - 为什么trim()在Clojure中的map内部不起作用?

javascript - 通过对象进行 react 循环并使用带有参数的 onClick 函数渲染 div

scala - 如何以最佳方式传递元组参数?

javascript - JSON.stringify 的单行输出

jQuery 在函数之间切换 - 执行零、一、二、三...次

javascript - 从函数更新全局变量

具有非关键字键的映射的 Clojure 规范

c++ - 获取第 n 个可变参数值(不是类型)