为什么在 Common Lisp 中这个用于漂亮打印宏扩展的宏不起作用?有哪些替代工具?
Why this macro to pretty print macro expansions in Common Lisp does not work? What are the alternatives tools for this?
我正在尝试通过 Common Lisp:对符号计算的简单介绍 来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。
在第 14 章的最后一章中,作者介绍了宏。他展示了一个名为 PPMX
的工具,它代表:“Pretty Print Macro eXpansion”。
使用此工具,您可以:
> (ppmx (incf a))
Macro expansion:
(SETQ A (+ A 1))
该工具是独立的,因为本书为其提供了代码定义:
(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)))
不幸的是,我不能运行它,因为编译不起作用。史莱姆的 REPL 抛出这个错误:
ch-14.lisp:3:33:
read-error:
READ error during COMPILE-FILE:
Comma not inside a backquote.
Line: 3, Column: 33, File-Position: 101
Stream: #<SB-INT:FORM-TRACKING-STREAM for "file /tmp/slimeD4xBr3" {10036BFC63}>
Compilation failed.
逗号和左单引号在 emacs 中看起来与在 SO 中不同:
我在将书中的代码复制到emacs 时遇到了一些问题。它基本上是插入 '
而不是左单引号。
1 - 有办法解决这个问题吗?
2 - 这本书写于 80 年代后期。因此,我敢打赌现在有更好的工具。 Slime 或 SBCL 是否提供一些命令来漂亮地打印宏扩展?也许是图书馆或其他包裹?
谢谢。
按照@barmar 的建议,用户只需在 REPL 中写入:
CL-USER> *print-pretty*
T
CL-USER> (macroexpand (setf a 1)) ;without the quote it does not work
1
NIL
CL-USER> (macroexpand '(setf a 1)) ;with the quote it does
(SETQ A 1)
T
我正在尝试通过 Common Lisp:对符号计算的简单介绍 来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。
在第 14 章的最后一章中,作者介绍了宏。他展示了一个名为 PPMX
的工具,它代表:“Pretty Print Macro eXpansion”。
使用此工具,您可以:
> (ppmx (incf a))
Macro expansion:
(SETQ A (+ A 1))
该工具是独立的,因为本书为其提供了代码定义:
(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)))
不幸的是,我不能运行它,因为编译不起作用。史莱姆的 REPL 抛出这个错误:
ch-14.lisp:3:33:
read-error:
READ error during COMPILE-FILE:
Comma not inside a backquote.
Line: 3, Column: 33, File-Position: 101
Stream: #<SB-INT:FORM-TRACKING-STREAM for "file /tmp/slimeD4xBr3" {10036BFC63}>
Compilation failed.
逗号和左单引号在 emacs 中看起来与在 SO 中不同:
我在将书中的代码复制到emacs 时遇到了一些问题。它基本上是插入 '
而不是左单引号。
1 - 有办法解决这个问题吗?
2 - 这本书写于 80 年代后期。因此,我敢打赌现在有更好的工具。 Slime 或 SBCL 是否提供一些命令来漂亮地打印宏扩展?也许是图书馆或其他包裹?
谢谢。
按照@barmar 的建议,用户只需在 REPL 中写入:
CL-USER> *print-pretty*
T
CL-USER> (macroexpand (setf a 1)) ;without the quote it does not work
1
NIL
CL-USER> (macroexpand '(setf a 1)) ;with the quote it does
(SETQ A 1)
T