Functional programming 为什么(汽车“”(a b))评估为“报价”?

Functional programming 为什么(汽车“”(a b))评估为“报价”?,functional-programming,scheme,racket,Functional Programming,Scheme,Racket,我是一名初级Scheme程序员,我想丰富我在函数式编程方面的知识。我用drracketide编程。最近我发现了一些有趣的代码: (car ''(a b)) 输出: 'quote 有人能解释一下为什么要这样评价吗?这是因为“是quote的缩写。。。。所以 a、b车 实际上是 汽车报价 评估结果如下: 引用 正如Josh在评论中指出的,实际结果只是quote,REPL打印一个表达式,该表达式可以计算为quote(在本例中为“quote”或与上面quote相同的内容) 记住,任何表达式x的

我是一名初级Scheme程序员,我想丰富我在函数式编程方面的知识。我用drracketide编程。最近我发现了一些有趣的代码:

  (car ''(a b))
输出:

  'quote
有人能解释一下为什么要这样评价吗?

这是因为“是quote的缩写。。。。所以

a、b车

实际上是

汽车报价

评估结果如下:

引用

正如Josh在评论中指出的,实际结果只是quote,REPL打印一个表达式,该表达式可以计算为quote(在本例中为“quote”或与上面quote相同的内容)

记住,任何表达式x的'x只是引号x的简写形式,因此以下代码:

(car ''(a b))
与此等效:

(car (quote (quote (a b))))
现在很容易看出,您正在评估列表中的汽车,如下所示:

'(quote (a b))
其计算结果如下:

(list 'quote (list 'a 'b))
如果我们把车放在上面,我们会得到符号引号,这正是你看到的打印结果。

它没有

(car ''(a b))
那是

(car (quote (quote (a b))))
所发生的事情是,汽车得到评估,因为它是一个过程,每个参数得到评估一次,然后再应用

(quote (quote (a b))) ; ==> (quote (a b))
现在的报价a和b是报价。这不是“引用”。我可以证明。试着像这样把它包装在显示屏上:显示汽车a b。输出只是引用

那个么为什么你们会在“球拍互动”窗口中看到“报价”

Racket有一个功能,当表达式结果不是由程序显式打印时,可以调整数据的显示方式。标准取决于所选语言和所用语言!不按原样显示数据,而是可以评估并成为数据的东西。在REPL中,您可以评估输出并获得相同的结果,因为该模式有效


如果在左下角选择“选择语言”,然后按“显示详细信息”,则可以更改行为。部件输出语法允许您从4种方式中选择在“交互”窗口中显示结果。“打印”是默认语言,“写入”与显示数据和大多数方案手册中的预期内容相同

我们在同一时间写作?同样的答案-P@Rptx从技术上讲,你几乎领先了一分钟;谢谢大家的帮助:。这很容易理解。@Rptx是的,看起来是这样。你在我写我的答案时发布了你的答案,所以你是这里最快的枪手;为了补偿,我对解释做了一些扩展。记住,你没有得到符号“quote,你得到的是符号quote”quote是列表quote。Racket博士有时会通过打印一个表单来提供帮助,该表单将产生与结果相同的值,而不是结果本身。Racket博士实际上打印了quote的缩写形式,即“quote”,这是另一种计算符号quote的形式。我认为,如果你没有预料到这一点,这种行为是令人困惑的,如果你没有完全意识到其中的差异,更是如此。我见过其他的索求者被它绊倒。@JoshuaTaylor我知道它的计算结果实际上是引用了你正确指出的话。我只是写了REPL打印的内容。我更喜欢引用它,因为你可以对它进行评估并得到相同的结果。如果它打印quote,我会感到困惑,我尝试对它进行评估并得到quote:undefined;但也许那只是我,明白了。我把评论包括在内是因为很多时候,最初的询问者,或者后来发现它的人,或者在Racket博士中使用不同语言的人,或者Racket以外仍然有REPL的语言的人,会看到类似car a b评估为“引用”的内容,但这不是他们得到的结果。对于使用REPL的语言来说,我认为这仍然是相当罕见的行为,意识到这一点很重要。你在这方面也是对的。guile和mit scheme都打印了引文。不幸的是,它打印了。@MultiTeemer不幸的是,它仍然没有打印引文。您看到的不是实际的评估,而是在REPL中用一种特定支持的语言表示数据的方法。如果您阅读了我的答案,您甚至会看到如何将可视化行为更改为与其他方案实现完全相同。我自己不使用默认值,因为它很混乱。