代码之家  ›  专栏  ›  技术社区  ›  MadPhysicist

在读取器级别进行公共Lisp调试

  •  0
  • MadPhysicist  · 技术社区  · 7 年前

    我不太清楚如何恰当地表达这个问题。然而,事情是这样的。

    假设我们有一些宏与 defun

    然而,当我在REPL打电话时,我发现 NIL .

    0 回复  |  直到 7 年前
        1
  •  6
  •   Barmar    7 年前

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

    (pprint (macroexpand '(my-defun ...)))
    
        2
  •  3
  •   Simeon Ikudabo    7 年前

    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还会分解宏中的任何宏(如内置的公共Lisp宏)。Macroexpand-1会将细分限制为您创建的宏。