gpt4 book ai didi

macros - 从 Clojure 中的宏返回宏

转载 作者:行者123 更新时间:2023-12-04 06:01:45 25 4
gpt4 key购买 nike

正如在另一篇文章中所写,我正在用 Clojure 编写一个 Shen 编译器。
为此,我需要一个宏/函数,它接收一个符号作为参数,如果一个 Shen 函数绑定(bind)到它,它会返回该函数,如果该符号被定义为 Clojure 宏,它应该返回该宏,所以 ((function or) true false)应该给出与 (or true false) 相同的结果.

我的宏目前看起来像:

(defmacro kl/function [x] 
(cl/let [fn (symbol (cl/str (name x) "__fnPoF__"))]
(if (function? fn) `(eval ~fn) `(quote ~x))))

“__fnPoF__” 后缀是因为 Shen 中的双重命名空间。 (一个值和一个函数可以分配给同一个符号。)

我现在的问题是 ((function or) true false)计算结果为 false,因为它的计算结果为 ('or true false)但是如果我省略了“报价”( x 而不是 `(quote ~x) 我得到以下异常:
kl=> (function *)
CompilerException java.lang.RuntimeException: Can't take value of a macro: #'kl/*, compiling:(NO_SOURCE_PATH:8)

有人知道如何解决这个问题吗?

最佳答案

您不能“返回”宏,因为宏没有值(value)。但是您可以使(函数或)扩展为符号或;那么通常的 Clojure 宏扩展/评估机制将满足您的需求。所以,虽然我不知道沉是如何工作的,但似乎一个简单的改变是:

(defmacro kl/function [x] 
(cl/let [fn (symbol (cl/str (name x) "__fnPoF__"))]
(if (function? fn)
`(eval ~fn)
x)))

顺便说一句, eval让我印象深刻 灾难等待发生。我强烈怀疑 eval对你的目标是必要的。

关于macros - 从 Clojure 中的宏返回宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826906/

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