11

我在读取球拍博士的输出时遇到问题。默认情况下,它使用 mcons 显示列表。例如,scp 练习 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))

谢谢!

4

1 回答 1

15

你知道你在你的#lang线路中使用什么语言吗?下面的其余说明假设您使用的是一条#lang线。


如果你在#lang r5rs和你displaywrite价值观,你应该看到你期望的输出。

> (define p (list 1 2))
> (display p)
(1 2)
> (set-car! p 'one)
> (display p)
(one 2)

如果您只是在 Interactions 中输入裸露的值,DrRacket 会输入print它们,并使用您所看到的表示。在 DrRacket 中,您可以自定义值的方式print。这是一步一步的过程:

  1. 转到语言菜单,然后选择选择语言。您应该会看到弹出的语言对话框。

  2. 如果左下角的按钮显示 Show Details,单击它,对话窗口应展开以包含自定义项。

  3. 寻找输出样式选项。应该有四个选择:ConstructorQuasiquotewriteprint。选择书写样式,然后按确定确认自定义。

一旦你这样做了,那么:

> (display (list 1 2))
(1 2)
> (write (list 1 2))
(1 2)
> (list 1 2)
{1 2}

使用花括号,它的打印仍然与您预期的略有不同,因为它试图表明列表结构是可变的。

如果这让您感到困扰,我们可以解决它。在程序顶部附近添加以下行(但#lang在行之后)。

(#%require r5rs/init)

这一行引入了一个名为 Racket 的特定模块r5rs/init,该模块试图提高 r5rs 的合规性;特别是,对于可变对,大括号最终应该打印为圆形。

> (display (list 1 2))
(1 2)
> (write (list 1 2))
(1 2)
> (list 1 2)
(1 2)
于 2012-02-19T08:12:06.880 回答