gpt4 book ai didi

macros - Clojure 宏定义令人困惑

转载 作者:行者123 更新时间:2023-12-02 06:34:29 24 4
gpt4 key购买 nike

clojure 宏对我来说是一个难点,这是一个来自“Pratical Clojure”的宏示例:

(defmacro triple-do [form] 
(list 'do form form form))

user=> (triple-do (println "test"))

test

test

test

nil

这个三重 Action 效果很好我认为以下版本应该可以工作,但不行

(defmacro triple-do [form] 
(do form form form))

user=> (triple-do (println "test"))

test

nil

为什么只打印一次?

下面的内容让我非常困惑

(defmacro test-macro [form] (do form (println "hard code test")))


user=> (test-macro (println "hello"))

hard code test

nil

为什么“hello”不显示在控制台中?

最佳答案

宏是返回 Clojure s 表达式的函数,然后对其进行编译,或者如果宏返回宏则再次展开。这个替换过程递归地重复,直到没有宏剩余,然后评估最终的代码。与最终生成的代码将运行的内容相比,仔细考虑宏扩展时运行的内容会有所帮助。

macroexpand-1 函数非常有用,它可以向您展示宏扩展的内容:

user> (macroexpand-1 '(test-macro (println "hello")))
hard code test
nil

从中您可以看到打印语句是在宏扩展时发生的。如果您在执行之前添加语法引用,则宏可能更有意义。

user> (defmacro test-macro [form] `(do ~form (println "hard code test")))
#'user/test-macro
user> (macroexpand-1 '(test-macro (println "hello")))
(do (println "hello") (clojure.core/println "hard code test"))

在这种情况下,打印会在宏完成扩展后运行。

关于macros - Clojure 宏定义令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20754935/

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