【发布时间】:2015-02-27 13:10:43
【问题描述】:
我是 LISP 的新手,正在尝试使用深层嵌套列表。 所有带有列表的基本函数,如 CONS 或 LIST 都不会给出正确的结果。他们用符号 # 替换列表的一部分。
例如:
(list '(1 (2 (3 (4 (5))))) '(6 (7 (8 (9 (10)))))))
=> ((1 (2 (3 #))) (6 (7 (8 #))))
有没有人想办法解决这个问题?
【问题讨论】:
标签: lisp nested-lists
我是 LISP 的新手,正在尝试使用深层嵌套列表。 所有带有列表的基本函数,如 CONS 或 LIST 都不会给出正确的结果。他们用符号 # 替换列表的一部分。
例如:
(list '(1 (2 (3 (4 (5))))) '(6 (7 (8 (9 (10)))))))
=> ((1 (2 (3 #))) (6 (7 (8 #))))
有没有人想办法解决这个问题?
【问题讨论】:
标签: lisp nested-lists
您可以通过设置变量*print-level* 和*print-length* 来调整打印内容的深度和长度。
(看起来你的*print-level* 是 4。)
完整的文档和示例在HyperSpec。
其中一个例子:
(setq a '(1 (2 (3 (4 (5 (6))))))) => (1 (2 (3 (4 (5 (6))))))
(dotimes (i 8)
(let ((*print-level* i))
(format t "~&~D -- ~S~%" i a)))
>> 0 -- #
>> 1 -- (1 #)
>> 2 -- (1 (2 #))
>> 3 -- (1 (2 (3 #)))
>> 4 -- (1 (2 (3 (4 #))))
>> 5 -- (1 (2 (3 (4 (5 #)))))
>> 6 -- (1 (2 (3 (4 (5 (6))))))
>> 7 -- (1 (2 (3 (4 (5 (6))))))
=> NIL
【讨论】:
为了简洁起见,您看到的是连接的输出。实际的列表是正确的并且不受影响,但是因为打印到输出会太长,所以lisp REPL在打印时会缩短它并使用#表示它已经这样做了。
【讨论】:
*print-circle* 设置为 nil 也可能会有所帮助,但只有在您确定没有循环结构共享时才这样做。