在Dr Racket中的mcons

11

我在使用Dr Racket时遇到了读取输出的问题。默认情况下,它使用mcons显示列表。例如,SICP练习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个回答

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中,你可以自定义值的print方式。下面是具体步骤:
  1. 打开语言菜单,选择选择语言,然后弹出语言对话框。
  2. 如果左下角的按钮上写着“显示详情”,点击它,对话框窗口应该会展开以包含自定义选项。
  3. 寻找输出风格选项。应该有四个选择: Constructor, Quasiquote, write, 和print。选择write风格,然后按确定来确认自定义。
这样做之后,就可以:
> (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)

谢谢!写作风格起了作用。我之前使用的是 #lang planet neil/sicp。但现在,使用写作风格语言后,显示为 SICP PLaneT 1.16 自定义,并提示“read: #lang not enabled in the current context”,我不得不注释掉 #land 行才能使其正常工作。 - Dmitri
1
好的。我稍后会跟Neil联系,看看他的软件包默认设置是否可以更改,使其默认为写入状态。 - dyoo
如果你是从终端而不是DrRacket运行Racket(我是通过Emacs中的geiser-mode运行的),那么你该如何配置输出样式? - crowding
@crowding 请参考:http://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._global-port-print-handler%29%29。例如,您可以通过执行*(print-as-expression #f)*来配置默认的打印处理程序以不使用表达式样式打印。 - dyoo
@dyoo,请问您跟Neil的后续进展如何了? - Daniel Le

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接