Scheme 方案表达式评估

Scheme 方案表达式评估,scheme,lisp,Scheme,Lisp,我正在阅读这本书——Scheme编程语言,第四版。在练习中,有一个表达式car list+-*/2 3。下面是我相信表达式将被计算的步骤。请让我知道我的理解是否正确 表达式列表+-*/计算为过程列表+-*/。我知道列表总是会产生一个合适的列表,有人能说一下使用列表和使用cons之间的一些区别吗? 表达式car+-*/计算为符号+,该符号计算为过程。我真的不明白car+-*/是如何计算的,在REPL提示符下键入car+-*/会产生一个错误。 表达式+2 3的计算结果为5。 如果我能得到其他/深入的

我正在阅读这本书——Scheme编程语言,第四版。在练习中,有一个表达式car list+-*/2 3。下面是我相信表达式将被计算的步骤。请让我知道我的理解是否正确

表达式列表+-*/计算为过程列表+-*/。我知道列表总是会产生一个合适的列表,有人能说一下使用列表和使用cons之间的一些区别吗? 表达式car+-*/计算为符号+,该符号计算为过程。我真的不明白car+-*/是如何计算的,在REPL提示符下键入car+-*/会产生一个错误。 表达式+2 3的计算结果为5。 如果我能得到其他/深入的解释,我会很高兴的

对然而,这些过程没有文字表示法,所以当您计算+时,您会得到一些疯狂的文字表示法,比如复制它并将其粘贴到repl中,不会返回相同的对象。列表也是如此。当您对列表1233求值时,您会得到1233,但您不能只写1233,因为它会认为它应该将1作为带有两个参数的过程调用。列表1 2 3使cons 1 cons 2 cons 3'成为嵌套对链。最后一个cdr是正确的。因此,允许列表执行其操作的原语是cons。 错。您有一个经过计算的表达式列表+-*/类似于。已计算变量的列表,您现在可以看到它们的视觉表示。对其执行car操作会得到第一个对象,该对象与计算全局变量+时得到的对象相同。此步骤中不涉及任何符号。上一步也没有涉及符号,因为裸符号是变量test变成了一个符号,而test变成了变量指向的任何东西。按名称列出的所有过程都只是在应用程序之前得到评估的变量。这是Scheme中的默认行为

由于对象与值+is相同,因此它将在计算其余操作数后将其相加。因为它们都是数字,所以传递给apply的参数保持不变,但是如果有像+*3*4这样的表达式,那么像*3这样的操作数需要求值,其结果就是应用的结果

您可以应用替换规则。这不是Scheme解释器所做的,但是任何变量都可以被它所拥有的值替换,每个表达式都可以被它的结果替换,只要你不改变任何东西:

((car (list + - * /)) (- 5 2) (/ 4 2)) ; == (car (list + - * /)) evaluates to the same value as the variable +
(+ (- 5 2) (/ 4 2)) ; == (- 5 2) evaluates to 3, (/4 2) evaluates to  2
(+ 3 2)             ; == (+ 3 2) evaluates to 5
; ==> 5 (the result)

注意,我用变量+而不是符号替换了car list+-*/。他们都是一样的:情商?车辆列表+-*/+;==>t

DrRacket中的步进器是探索评估顺序的完美工具。 步进器允许您一次查看一个评估步骤的效果。 你甚至可以后退一步

然而,stepper仅适用于初级和中级语言。 图像来自以下使用中间语言的程序

(car (list + - * /))
(+ 2 3)

为什么不在计划中尝试一下呢?您可以键入表达式并查看结果…是的,我已经试过了。我并不真正关心结果。我想知道列表与cons等相比有什么作用,但你写下的步骤是错误的。你怎么能试过呢?@RainerJoswig我的意思是我试过表达car list+-*/2 3。我不确定我对这些步骤的理解是否正确:。这就是我需要帮助的地方。对,所以没有符号-和你写的不同。