Common Lisp的PPMX宏无法运行怎么修复?有哪些宏展开美化替代工具?
问题1:PPMX宏报错修复方法
报错的核心原因是书籍排版使用了智能弯引号,与Lisp语法要求的符号不匹配:
- 宏体开头的左弯引号
‘需要替换为Lisp语法中的反引号` (macroexpand-1 ’,form)中的右弯引号’需要替换为Lisp语法中的直单引号'
修正后的完整代码如下:
(defmacro ppmx (form) "Pretty prints the macro expansion of FORM." `(let* ((exp1 (macroexpand-1 ',form)) (exp (macroexpand exp1)) (*print-circle* nil)) (cond ((equal exp exp1) (format t "~&Macro expansion:") (pprint exp)) (t (format t "~&First step of expansion:") (pprint exp1) (format t "~%~%Final expansion:") (pprint exp))) (format t "~%~%") (values)))
问题2:现有宏展开美化工具
Slime自带功能
你当前使用的Slime已经原生提供了比PPMX更完善的宏展开美化能力,无需额外定义工具:
- 按下
C-c RET(对应命令slime-macroexpand-1):对光标处的宏做单次展开,结果会在独立缓冲区中高亮、格式化显示,还支持在展开结果上继续做嵌套宏的逐层展开 - 按下
C-c M-m(对应命令slime-macroexpand-all):对光标处的宏做全量展开,同样支持格式化展示、嵌套展开操作
SBCL原生功能
Common Lisp标准本身自带相关函数,简单组合即可实现类似PPMX的效果:
直接在REPL执行(pprint (macroexpand-1 '(incf a)))即可打印单次展开的格式化结果,执行(pprint (macroexpand '(incf a)))可以打印全量展开的格式化结果。
第三方工具
常用的跨实现宏展开工具为trivial-macroexpand-all库,提供了统一的全量宏展开接口,配合标准的pprint函数即可实现美化打印。绝大多数日常开发调试场景下,Slime自带的宏展开功能已经足够使用。
内容的提问来源于stack exchange,提问作者Pedro Delfino
相关产品推荐
相关产品推荐

