gpt4 book ai didi

macros - 在 emacs lisp 中定义一个 let 宏作用域

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

在 emacs lisp 中(但也欢迎与普通 lisp 相关的答案)我有一个使用宏的库,我想仅在特定上下文中执行时劫持宏的参数之一。本质上我想要的是一个宏:

; My macro. This is a sketch of what I want that doesn't work.
(defmacro hijack-f (body)
`(macrolet ((f (x) `(f (+ 1 ,x))))
,@body))

; Defined in the library, I don't want to deal with these
(defmacro f (x) x)
(defun g (x) (f x))

这样

(g 1) ; => 1
(hijack-f (g 1)) ; => 2
(hijack-f (hijack-f (g 1))) ; => 3

编辑:@melpomene 和@reiner-joswig 正确地指出 fhijack-f 之前在 g 中扩展。作为后续是有一个 hijack-f 这样的:

(f 1) ; => 1
(hijack-f (f 1)) ; => 2
(hijack-f (hijack-f (f 1))) ; => 3

最佳答案

据我所知,您想要的是不可能的,因为 g 不包含 f 的调用。相反,f 运行 first 并扩展到(部分)g 的定义。

即:

(defun g (x) (f x))

立即变成

(defun g (x) x)

然后将 g 定义为函数(其值为 (lambda (x) x))。

在运行时使用 f 不会影响任何事情,因为在您调用 g 时它的调用早已消失。

关于macros - 在 emacs lisp 中定义一个 let 宏作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50191083/

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