【问题标题】:Clojure: function arguments/signatures using macro or defClojure:使用宏或定义的函数参数/签名
【发布时间】:2012-10-07 21:27:30
【问题描述】:

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

(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 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 的工作定义是否足够奇怪以至于这不再简单。)

【问题讨论】:

    标签: function clojure arguments definition reduce


    【解决方案1】:

    问题是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 等。

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2011-05-16
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多