博士在博士球拍

时间:2012-02-19 06:37:28

标签: lisp scheme sicp racket

我在阅读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))

谢谢!

1 个答案:

答案 0 :(得分:15)

您知道在#lang行中使用的语言是什么?以下其余说明假设您使用的是#lang行。


如果您在#lang r5rs以及displaywrite值,则应该会看到您期望的输出。

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

如果您只是在交互中输入裸值,DrRacket将print它们,并使用您正在看到的表示。在DrRacket中,您可以customize重视print的方式。这是一个循序渐进的过程:

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

  2. 如果左下角的按钮显示显示详细信息,请单击该按钮,对话框窗口应展开以包含自定义项。

  3. 查找输出样式选项。应该有四种选择:构造函数 Quasiquote 编写打印。选择写入样式,然后按确定确认自定义。

  4. 一旦你这样做,那么:

    > (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)