gpt4 book ai didi

lisp - 调试宏 - 调用时未绑定(bind)变量

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

本质上,我正在尝试编写一个宏,它会准确地打印出一些我正在尝试评估的语句,以及它的评估值。

到目前为止,我有以下内容:

(defmacro dbg (statement)
(format t "~a: ~a" statement (eval statement)))

然后在 slime repl 中输入以下内容:(dbg (* 2 2)) 我得到了想要的结果:

"(* 2 2): 4"

但是,当我尝试在以下函数中使用它时**:

(defun get-start-position (curr-prime)

(dbg (/ (- (* curr-prime curr-prime) 3) 2))

(/ (- (* curr-prime curr-prime) 3) 2))

slime 报告说 curr-prime 是未绑定(bind)的(只是把所有东西都放在 let 中没有帮助)。更具体地说,尝试编译函数 get-start-position 的行为导致:

2 compiler notes:

primes.lisp:27:3:
error:
during macroexpansion of (DBG (- # 3)). Use *BREAK-ON-SIGNALS* to intercept:

The variable CURR-PRIME is unbound.

primes.lisp: 29:9:
note:
deleting unreachable code
==>
CURR-PRIME

Compilation failed.

大概(第二个警告让我感到困惑),错误的出现是因为宏在调用它的函数有机会将 curr-prime 绑定(bind)到某个值之前展开(我在这里是正确的吗?)。那就是说我不知道​​如何解决这个问题

我做错了什么?


** 为了它的值(value),我编写了一个素筛,其中指示器数组具有以下元素:

(3,5,7,9, ...)

这个特定的函数会得到给定素数平方的索引

最佳答案

不是 Lisp 宏的专家,但这样做可以:

(defmacro dbg (statement)
(let ((result (gensym)))
`(let ((,result ,statement))
(format t "~a: ~a" ',statement ,result)
,result)))

然后

(dbg (* 2 2))

=> (* 2 2): 4
4

(defun get-start-position (curr-prime)
(dbg (/ (- (* curr-prime curr-prime) 3) 2)))

(get-start-position 1)

=> (/ (- (* CURR-PRIME CURR-PRIME) 3) 2): -1
-1

关于lisp - 调试宏 - 调用时未绑定(bind)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746801/

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