gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:32:02 28 4
gpt4 key购买 nike

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com