常见的lisp:break,但返回输入而不是nil?

时间:2013-09-21 01:27:49

标签: lisp common-lisp

我是lisp的新手,我正在学习。

标准的常见lisp中断函数1.弹出调试器,然后2.如果选择继续,则返回nil。

在我看来,一个中断函数会让你进入调试器但返回它的INPUT将非常有用。然后,您可以在给定的s表达式周围透明地插入它,以查看该点的程序状态。

所以我可以做类似

的事情
CL-USER> (break-transparent (+ 1 2))

会让我进入调试器并让我环顾四周然后返回

3

在lisp中是否有这样的东西,如果没有,有没有办法制作这样的东西?我对宏还不好。

谢谢,

编辑: Doug Currie用一个简单的宏来回答这个问题。这是我稍微修改过的版本,对于其他任何有这个问题的人来说,它会在调试器窗口中显示断开透明的前面和中心的参数。

(defmacro break-transparent (exp)
  `(let ((x ,exp)) (break "argument to break: ~:S" x) x))

2 个答案:

答案 0 :(得分:2)

您可以将break-transparent写为扩展为:

的宏
(progn
  (break)
  (+ 1 2))

或者如果你真的想在休息之前评估表达式:

(let ((x (+ 1 2)))
  (break)
  x)

所以,

(defmacro (break-transparent exp)
  `(let ((x ,exp)) (break) x))

答案 1 :(得分:0)

由于您在稍微修改过的版本中添加了问题的其他答案中的宏,因此这里的固定版本不会添加可能会干扰现有版本的新标识:

(defmacro break-transparent (value)
  (let ((g (gensym)))
    `(let ((,g ,value))
      (break "argument to break: ~:S" ,g)
      ,g)))