gpt4 book ai didi

macros - 在运行时调用 macroexpand

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:01 25 4
gpt4 key购买 nike

是否可以在运行时在已编译的 lisp 可执行文件中扩展宏?我认为这是不可能的,因为宏扩展只能在预编译时发生,但是当我在编译代码中调用 macroexpand 时,我得到了输出。

最佳答案

宏是一种通常在编译或求值期间自动调用的函数,其返回值会在原始表达式的位置进行编译或求值。

但是因为它只是一个函数,所以也没有什么可以阻止它在运行时被显式调用,这就是 MACROEXPANDMACROEXPAND-1 所做的。

大致相当于:

(defun macroexpand-1 (form &optional env)
(if (and (listp form) (car form)) ;; list expression
(let ((macfun (macro-function (car form)))
(if macfun
(funcall macfun form env)
form))
form))

(请注意,此定义不处理符号宏或使用 *MACROEXPAND-HOOK*,以保持简单。)

可以在定义宏时使用EVAL-WHEN,使宏定义只在编译环境中可用。如果这样做,尝试在运行时扩展将失败。

关于macros - 在运行时调用 macroexpand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56635170/

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