读者级别的常见Lisp调试

时间:2019-02-28 23:48:57

标签: lisp common-lisp

我不确定如何正确表达这个问题。但是,它是这样的。

假设我们有一些宏与Common Lisp中的defun相似,并且是在此宏之上构建的。我使用其中一个这样的宏进行了声明,并且编译得很好。

但是,当我在REPL打电话时,得到NIL作为结果。这似乎令人困惑,所以我在REPL评估了原始声明。评估为NIL

我需要调试它。我的问题是我应该看读者级别还是其他地方。也就是说,如果没有错误抛出,我应该在哪里寻找解决方法?

2 个答案:

答案 0 :(得分:6)

使用MACROEXPAND函数查看您的宏调用正在扩展到什么。

(pprint (macroexpand '(my-defun ...)))

答案 1 :(得分:3)

您可以使用诸如macroexpand-1函数之类的东西,我将解释为什么它比普通的宏扩展要好:

CL-USER> (defmacro our-when(test &body body)
   `(if ,test
    (progn
      ,@body)))
OUR-WHEN
CL-USER> (macroexpand-1 '(our-when(> 2 1)(format t "Hello World")))
(IF (> 2 1) (PROGN ((FORMAT T "Hello World"))))
T
CL-USER> 

在这里,我们创建了一个宏,我们实际上可以看到该宏如何扩展其中的表达式。在进行调试时,最好使用macroexpand-1而不是使用macroexpand,因为macroexpand还会分解宏中的任何宏(例如内置的Common Lisp宏)。 Macroexpand-1将细分仅限于您创建的宏。