lisp - 为什么SBCL会这样打印Sublis?

标签 lisp common-lisp sbcl

所以函数:

(defun royal-we ()
  (sublis '((i  .  we))
      '(if I learn lisp I will be pleased)))

SBCL 中的输出是这样打印的:

(IF WE
    LEARN
    LISP
    WE
    WILL
    BE
    PLEASED)

然而示例一:

(sublis '((roses . violets)  (red . blue))
        '(roses are red))

给出输出

(VIOLETS ARE BLUE)

为什么 SBCL 在不同的行上打印列表的原子,这与 Clisp 等其他发行版不同?

最佳答案

(if …) 列表由 pretty-printer 处理,假设它(可能)是一个实际的 Lisp 形式。

CL-USER> (setf *print-pretty* nil)
NIL
CL-USER> '(if 1 2 3)
(IF 1 2 3)
CL-USER> (setf *print-pretty* t)
T
CL-USER> '(if 1 2 3)
(IF 1
    2
    3)

您会发现,除其他外,let 形式也将类似地缩进,并且某些 loop 符号将开始新行。还有一些其他影响。

CL-USER> '(loop for thing in stuff with boo = 4 count mice)
(LOOP FOR THING IN STUFF
      WITH BOO = 4
      COUNT MICE)
CL-USER> '(let 1 2 3)
(LET 1
  2
  3)
CL-USER> '(defun 1 nil 2 3)
(DEFUN 1 () 2 3)
CL-USER> (setf *print-pretty* nil)
NIL
CL-USER> '(defun 1 nil 2 3)
(DEFUN 1 NIL 2 3)

顺便说一句,相关标准找到了……http://www.lispworks.com/documentation/lw60/CLHS/Body/22_b.htm ……如果您想要为您的目的重新编程。

不过,对于仅打印数据列表,我怀疑禁用 pretty-print 或使用 FORMAT 可能就足够了。

例如,

 (format t "~&~@(~{~a~^ ~}~)" '(violets are blue))
 Violets are blue

关于lisp - 为什么SBCL会这样打印Sublis?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34049488/

相关文章:

lisp - clisp中atoi对应的标准函数是什么?

macros - 我的第一个 Lisp 宏;漏水了吗?

lisp - (= 1/5 0.2) 是假的?

recursion - 递归检查列表中的原子

lisp - 如何在 Common Lisp 中将列表打印为矩阵

common-lisp - 如何更改SBCL的当前目录?

compiler-errors - SBCL 错误消息 : Any way to improve?

lisp - 我如何在 Lisp 中内存一个递归函数?

functional-programming - 在 Racket 中定义错误

windows - 如何使用 SBCL 安装 lispbuilder-sdl?