基本上我正在尝试编写一个宏,它将打印出我正在尝试评估的一些语句,以及它所评估的值。
到目前为止我的内容如下:
(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))
史莱姆报告说,curr-prime是未绑定的(并且只是将所有内容都放在了一个不帮助的地方)。更具体地说,尝试编译函数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绑定到某个值(我在这里是否正确?)。这说我不知道如何解决这个问题
我做错了什么?
**为什么它值得我编写一个主筛,其中指标数组具有以下元素:
(3,5,7,9,...)
这个特殊函数会得到给定素数
的平方指数答案 0 :(得分:2)
不是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