我在阅读dr drcket的输出时遇到了麻烦。默认情况下,它使用mcons显示列表。例如,sicp exercise 2.32产生:
> (subsets (list 1 2 3))
(mcons
(mcons
'()
(mcons
(mcons 3 '())
(mcons
(mcons 2 '())
(mcons
(mcons 2 (mcons 3 '()))
(mcons
(mcons 1 '())
(mcons
(mcons 1 (mcons 3 '()))
(mcons
(mcons 1 (mcons 2 '()))
(mcons (mcons 1 (mcons 2 (mcons 3 '()))) '()))))))))
'())
我在阅读本文时遇到了麻烦。有没有办法使输出看起来像:
(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3))
谢谢!
答案 0 :(得分:15)
您知道在#lang
行中使用的语言是什么?以下其余说明假设您使用的是#lang
行。
如果您在#lang r5rs
以及display
或write
值,则应该会看到您期望的输出。
> (define p (list 1 2))
> (display p)
(1 2)
> (set-car! p 'one)
> (display p)
(one 2)
如果您只是在交互中输入裸值,DrRacket将print
它们,并使用您正在看到的表示。在DrRacket中,您可以customize重视print
的方式。这是一个循序渐进的过程:
转到语言菜单,然后选择选择语言。您应该会看到语言对话框弹出。
如果左下角的按钮显示显示详细信息,请单击该按钮,对话框窗口应展开以包含自定义项。
查找输出样式选项。应该有四种选择:构造函数, Quasiquote ,编写和打印。选择写入样式,然后按确定确认自定义。
一旦你这样做,那么:
> (display (list 1 2))
(1 2)
> (write (list 1 2))
(1 2)
> (list 1 2)
{1 2}
使用花括号仍然会比预期略有不同,因为它试图表明列表结构是可变的。
如果这困扰你,我们可以解决这个问题。在程序顶部附近添加以下行(但在#lang
行之后)。
(#%require r5rs/init)
这一行引入了一个名为r5rs/init
的特定于球拍的模块,该模块试图提高r5rs的合规性;特别是,大括号最终应该打印为可变对的圆形。
> (display (list 1 2))
(1 2)
> (write (list 1 2))
(1 2)
> (list 1 2)
(1 2)