Emacs:在球拍模式下关闭漂亮的打印

Emacs: Turn off pretty printing in racket-mode

我 运行 在 Windows 10 上安装了 Emacs 24.5.1 并在 SICP. The MIT editor Edwin doesn't function well, especially on Windows. Racket appears to be a good alternative. I have installed both Racket and racket-mode 上工作,一切似乎 运行 没问题。但是,racket-mode 坚持要漂亮地打印我的结果。如何让它以十进制形式打印?

例如,

(require sicp)

(define (square x) (* x x))

(define (average x y)
  (/ (+ x y) 2))

(define (improve guess x)
  (average guess (/ x guess)))

(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))

(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))

这会产生如下结果

> (sqrt-iter 1 2)
577/408

当我 Google 术语 "Racket" 和 "pretty-print," 时出现很多 documentation 但我没有运气理解它。 Racket 文档似乎通过一些以 'pretty-print' 开头的变量来控制漂亮的打印。然而,在 M-x 中没有以 racket-pretty 开头的内容出现。也许分数形式不是 Racket 认为漂亮的打印?

使用浮点数 1.0 和 2.0 而不是精确数字 1 和 2 开始迭代。

文字 1 被读取为精确整数,而 1.0 或 1. 被读取为浮点数。

现在函数 / 适用于精确和不精确的数字。如果输入准确的数字,它会产生一个分数(最终会打印在 repl 中)。

那是你看到的不是漂亮打印机的效果,而是实际效果。该算法仅对浮点数作为输入有效,因此您可以考虑向您的函数添加对 exact->inexact 的调用。

这实际上是有意的,是 Scheme 标准(R5RS、R7RS)的一部分。它不限于 Racket,但应该是任何 Scheme interpreter/REPL 的输出。它与漂亮的印刷无关。它通常被认为是一件好事,因为它为您提供了准确的数字(有理数)而不是浮点数近似值。如果您确实想要浮点结果,请使用 1.0 而不是 1 等来请求它。

> (/ 1.0 3)
0.3333333333333333

或者,您可以使用 exact->inexact 函数,例如

> (exact->inexact 1/3)
0.3333333333333333

正如其他答案所解释的那样,事实证明这实际上与漂亮的印刷无关。

但是从字面上回答你的问题(如果你曾经确实想要在球拍模式下禁用漂亮的打印):

Emacs 变量是 racket-pretty-print

您可以使用 C-h v 查看有关它的文档。

要更改它,您可以:

  • 使用 Emacs' M-x 自定义 UI.

  • 在您的 Emacs 初始化文件中使用 (setq racket-pretty-print nil),例如在 racket-repl-mode-hook.