为什么(引用(1 2 3))显示'(1 2 3)而不是(1 2 3)?如何制作'走开?

时间:2017-08-16 01:08:33

标签: scheme racket

如果有&#39>,我不会让我通过函数列出一个列表。

2 个答案:

答案 0 :(得分:1)

Scheme和Racket具有不同的默认打印约定。使用参数print-as-expression更改Racket中的默认行为。

#lang racket
(print-as-expression #f)
(quote (1 2 3))

结果将打印为(1 2 3)

答案 1 :(得分:0)

您已标记了球拍。不确定是因为您在DrRacket中编程Scheme(如R5RS或R6RS),还是在DrRacket中编程#lang racket,因为标记racket可能意味着两者。

在Racket中,REPL以非常规的方式显示列表,并且根据您拥有的设置和您编程的语言而改变。如果您使用#lang racket,默认值不会显示值,而是将评估该值的表达式。

(list 1 2 3) ; ==> '(1 2 3)

真实值为(1 2 3),因为(list 1 2 3)'(1 2 3)评估为(1 2 3)。这就像回答2+3而不是5一样回答1+4的问题。如果这是你的问题,那么'根本就不存在。你可以用display打印它来证明:

(display (list 1 2 3)) ; ==> (1 2 3)

这里我清楚地通过一个函数列出了一个列表,它显示了该列表如何作为值。如果你去选择"选择语言"在左下角的下拉列表中,您可以在#lang racket的模态中选择输出样式。以下是一些预览:

(list 1 2 3)
; ==> (list 1 2 3) when using "constructor"
; ==> `(1 2 3) when using quasiquote
; ==> (1 2 3) when using write (same as Scheme and other LISPs)
; ==> '(1 2 3) when using print

Racket支持的其他语言不会因这些设置而改变,似乎R5RS使用构造函数而R6RS使用write,但括号被R6RS中的curlies替换。在两种语言中,仅显示交互窗口中的表达式,而不是定义窗口中表达式的结果。

我不确定这是否可以更改,但与#lang racket的方式相同,这只是可视化,因此对于一个功能来说它并不重要,因为它看起来并不重要在列表中,而是使用它。