Common Lisp设置*print-circle*为T引发特殊打印,如何禁用该行为?
解决Lisp中print-circle引发的重复元素标记问题
当你开启*print-circle*为T后,Lisp的REPL会检测列表中的重复对象(基于eq判断),用#n和#n#的标记来避免重复打印相同内容,但如果只想让特定列表打印时不出现这种标记,可以用以下两种方法:
方法一:临时关闭print-circle打印目标列表
通过let临时覆盖全局的*print-circle*值,只在打印目标列表时关闭循环标记功能,不影响全局设置:
(let ((*print-circle* nil)) (print your-target-list))
方法二:创建列表的副本
*print-circle*是通过对象的同一性来识别重复元素的,你可以为目标列表创建一个新的副本(浅拷贝或深拷贝),副本的元素和原列表元素不再是同一个对象,打印时就不会触发标记:
- 浅拷贝(适用于单层列表):
(setq copied-list (copy-list your-target-list)) (print copied-list)
- 深拷贝(适用于嵌套列表):
(setq copied-list (copy-tree your-target-list)) (print copied-list)
注意:如果原列表包含循环引用(比如列表自身引用自己),临时关闭
*print-circle*可能导致REPL无限打印,这种情况建议优先使用副本方法。
内容的提问来源于stack exchange,提问作者JEPrice
相关产品推荐
相关产品推荐

