调试宏 - 调用时未绑定的变量

时间:2014-03-30 16:50:22

标签: lisp

基本上我正在尝试编写一个宏,它将打印出我正在尝试评估的一些语句,以及它所评估的值。

到目前为止我的内容如下:

(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,...)

这个特殊函数会得到给定素数

的平方指数

1 个答案:

答案 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