gpt4 book ai didi

macros - Lisp 宏在我不希望它时评估表达式

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

我正在尝试用 lisp 编写一个宏,它返回传递给它的第 n 个表达式,并且只计算该表达式。例如:

(let ((n 2))
(nth-expr n (/ 1 0) (+ 1 2) (/ 1 0)))

应该返回 3。我收到除以 0 的错误。我的宏定义如下:

(defmacro nth-expr (n &rest expressions)
(let ((i (gensym))
(expr (gensym)))
`(do ((,i 1 (1+ ,i))
(,expr ,expressions (cdr ,expr)))
((= ,i ,n) (car ,expr)))))

知道我做错了什么吗?谢谢。

编辑:

感谢@Vsevolod Dyomkin 帮助我完成上述部分。现在还有一个问题。当我尝试做的时候

(let ((n 3) (x "win") (y "lose"))
(nth-expr n (princ x) (princ x) (princ y) (princ x)))

我收到错误 Error: Attempt to take the value of the unbound variable 'Y'

我更新后的代码如下所示:

(defmacro nth-expr (n &rest expressions)
(let ((i (gensym))
(expr (gensym))
(num (gensym)))
`(let ((,num (eval ,n)))
(do ((,i 1 (1+ ,i))
(,expr ',expressions (cdr ,expr)))
((= ,i ,num) (eval (car ,expr)))))))

最佳答案

最主要的是首先想出扩展。

工作代码应该是什么样的?宏用法将扩展到的代码?

然后您编写宏来创建这样的代码。

确保您没有评估宏中提供的任何代码。

对于您的问题,一个简单有用的扩展目标是 CASE 形式。

(case n
(0 (do-this))
(1 (do-that))
(2 (do-something-else)))

现在应该很容易编写一个将 (nth-expr n (/1 0) (+ 1 2) (/1 0)) 扩展为 CASE 形式的宏...

关于macros - Lisp 宏在我不希望它时评估表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8322589/

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