将Racket REPL的输出打印样式更改

5
我正在做SICP的问题,使用Racket中的#lang planet/neil指令。我更喜欢在Emacs中编写代码,并使用Geiser-mode通过Emacs运行Racket REPL。
Racket打印结果的方式往往会使用大量的mcons,这使得结果难以阅读。
racket@chap2.4.rkt> (list 1 2 3 4)
(mcons 1 (mcons 2 (mcons 3 (mcons 4 '()))))    

根据这个问题,在选择语言对话框中选择“write”输出样式可以更改DrRacket的输出样式。但是,这需要使用DrRacket GUI;是否有一种方法可以为Racket REPL更改此设置?

1个回答

9

背景:与SICP风格的Scheme不同,Racket的list是不可变的。要获取可变列表,在Racket中使用mlist。我猜测#lang planet/neil/SICP所做的是(require mpair),然后将mlist重命名为list。因此,在那个#lang中写list时,实际上是使用mlist

无论如何,默认情况下,mlist的打印方式不同。但是您可以更改两个参数。

print-as-expression

(print-as-expression #f)

现在它将被打印为:
{1 2 3 4}

花括号代替圆括号表示它是一个可变列表。要调整那个,请设置另一个参数:

print-mpair-curly-braces

(print-mpair-curly-braces #f)

现在应该打印为:

(1 2 3 4)

要让普通的Racket REPL始终这样做,我认为您可以将这两个表达式放在您的 Racket init file中,例如,在OSX和Linux上是~/.racketrc。虽然我不确定Geiser提供的REPL是否读取init文件,但如果您对这些表达式进行评估,它们应该会持续存在于Geiser REPL会话中,因此您可以将它们放在某个.rkt文件中并访问一次。

1
谢谢!还有一件事要补充,当REPL在SICP内部时,这些命令是无法访问的,但我可以在geiser中键入,enter #f或按下C-c C-m返回到顶层。 - crowding
1
啊,好的,所以 #lang SICP 没有提供它们。我认为你可以使用 (require (only-in racket/base print-as-expression print-mpair-curly-braces)) 来使它们可用。 - Greg Hendershott
1
顺便说一句,你可以很容易地让Geiser读取~/.racketrc文件,只需要在你的geiser-racket-init-file中放置以下内容(默认情况下位于~/.racket-geiser):(load (find-system-path 'init-file)) - GDP2

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