跟踪lambda表达式求值

跟踪lambda表达式求值,lambda,scheme,sicp,operator-precedence,interpreted-language,Lambda,Scheme,Sicp,Operator Precedence,Interpreted Language,我在Scheme中遇到了一些看起来很棘手的lambda表达式的问题,我想看看解释器是如何计算它们的 我希望Scheme解释器打印所有评估步骤,如中所示 我正在寻找使用任何方案解释器的解决方案。我已经试过了,但它只跟踪过程调用,而不是每个表达式 激励示例 根据以下教会数字的定义: 任务是: 直接定义1和2(不包括0和add-1) 我希望对照评估(添加-1零)和(添加-1零))的结果,检查我对1和的定义 这是我希望Scheme解释器打印出来的内容: > (add-1 zero) (add-1

我在Scheme中遇到了一些看起来很棘手的lambda表达式的问题,我想看看解释器是如何计算它们的

我希望Scheme解释器打印所有评估步骤,如中所示

我正在寻找使用任何方案解释器的解决方案。我已经试过了,但它只跟踪过程调用,而不是每个表达式

激励示例

根据以下教会数字的定义:

任务是:

直接定义
1
2
(不包括
0
add-1

我希望对照评估
(添加-1零)
(添加-1零))
的结果,检查我对
1
的定义

这是我希望Scheme解释器打印出来的内容:

> (add-1 zero)
(add-1 (lambda (f) (lambda (x) x)))
(lambda (f) (lambda (x) (f (((lambda (f) (lambda (x) x)) f) x))))
(lambda (f) (lambda (x) (f ((lambda (x) x) x))))
(lambda (f) (lambda (x) (f x)))
>

尝试一下Racket的内置步进器,这里有一些操作方法。

这对于方程(what)之类的组合运算非常容易

有了组合符,一切都变了:
abcd
实际上是
((ab)c)d
abc=d
相当于
(定义a(lambda(b)(lambda(c)d))

现在很清楚
f
x
的意图是什么:
x
代表“零”数据元素的具体实现,
f
代表“后续”操作的具体实现,与“零”的给定具体实现兼容
f
x
应该真正以助记符命名:

zero s z = z
add1 n s z = s (n s z)
看起来不再那么复杂了,语法更方便了,对吧<代码>lambda
本身就是一个印刷事故。现在,

one s z = s z         ; e.g. (1+ 0)
two s z = s (s z)     ; e.g. (1+ (1+ 0))

根据程序跟踪步骤

  • 要评估组合,请执行以下操作:
  • 计算组合的子表达式
  • 将作为最左侧子表达式(运算符)值的过程应用于作为其他子表达式(操作数)值的参数

  • 要将复合过程应用于参数,请使用每个形式参数替换为相应的参数来计算过程体
我们得到

add1 zero = 
  ( n f x => f (n f x) ) ( f x => x ) =
  ( f x => f ( ( f x => x ) f x ) )
这里代换实际上停止了,因为结果是一个简单的lambda表达式,也就是说,不是一个组合。仅当再提供两个参数时,才会完整地进行计算:

add1 zero s z = 
  ( n f x => f (n f x) ) ( f x => x ) s z =
  ( f x => f ( ( f x => x ) f x ) ) s z =
  ( x => {s} ( ( f x => x ) {s} x ) ) z =    ; {s} is definition-of s
  {s} ( ( f x => x ) {s} {z} ) =             ; {z} is definition-of z
  ; must find the value of the operand in combination
  {s} ( ( x => x ) {z} ) = 
  {s} {z}

然后根据
s
z
的实际定义进行计算。这就是上面显示的方程式(1)用较短的符号表示的。

谢谢,我来试试!可能重复的
add1 zero = 
  ( n f x => f (n f x) ) ( f x => x ) =
  ( f x => f ( ( f x => x ) f x ) )
add1 zero s z = 
  ( n f x => f (n f x) ) ( f x => x ) s z =
  ( f x => f ( ( f x => x ) f x ) ) s z =
  ( x => {s} ( ( f x => x ) {s} x ) ) z =    ; {s} is definition-of s
  {s} ( ( f x => x ) {s} {z} ) =             ; {z} is definition-of z
  ; must find the value of the operand in combination
  {s} ( ( x => x ) {z} ) = 
  {s} {z}