gpt4 book ai didi

macros - Clojure 的乐趣,宏

转载 作者:行者123 更新时间:2023-12-02 06:38:16 27 4
gpt4 key购买 nike

我一直在体验 Clojure 练习的乐趣,并遇到了这个示例

(defn build-contract [c]
(let [args (first c)]
(list
(into '[f] args) ;; here is where i am confused
(apply merge
(for [con (rest c)]
(cond (= (first con) :require)
(assoc {} :pre (vec (rest con)))
(= (first con) :ensure)
(assoc {} :post (vec (rest con)))
:else (throw (Exception. (str "Unkown tag " (first con)))))))
(list* 'f args)))) ;; and here

(defn collect-bodies [forms]
(for [form (partition 3 forms)]
(build-contract form)))

(defmacro contract [cg & forms]
(list* `fn cg (collect-bodies forms)))

我似乎无法理解为什么你想要在该向量中使用一个名为 f 的符号。符号是对事物的引用,那么 f 会引用什么呢?为什么我们需要引用它?

最佳答案

该宏构建一个函数文字表达式(fn 形式)。

(into '[f] args) ;; here is where i am confused

这是参数向量。 f 在这里出现,充当形式论证的角色。

(list* 'f args)))) ;; and here

这是函数应用程序。 f 是一个函数参数,在这里它应用于 args

构建后,生成的定义将如下所示。

(fn name [f arg1 arg2] ... (f arg1 arg2))

关于macros - Clojure 的乐趣,宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20760362/

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