[SICP] 求值规则与惰性求值

本文探讨了编程语言中的求值策略,包括应用序求值(即饥饿求值)和惰性求值(延迟计算)。通过举例说明了两种策略在表达式和函数调用中的不同行为,并介绍了Scheme中的延迟计算实现,如Thunk和惰性求值。同时提到了特殊块的求值规则和递归函数的执行流程,强调在Scheme中理解递归和执行流程的重要性。
摘要由CSDN通过智能技术生成

在C/Java学习中,会了解和求值相关的很多知识。例如:

  • 表达式的求值顺序,
  • b-e ? exp1: exp2求值顺序
  • 函数调用时,实参如何传递给方法的形参

这些知识背后,是设计编程语言时采用的求值策略(Evaluation Strategy)求值策略决定函数的实参应该在何时被求值,以及实参以什么方式传递到函数体内。

虽然看起来求值策略仅仅涉及到函数调用,其实表达式的操作符,条件表达式的?都是一个函数调用。函数的实参求值时机分两种:

applicative-order Vs.normal-order 

饥饿求值(Strict/Eager Evaluation)和延迟计算/惰性求值 (delay computing /Lazy Evaluation)。

1. 应用序求值

先看表达式的计算过程:

(* (+ 1 (- 2 1)) (- 2 1))
= (* (+ 1 1) (- 2 1))
= (* 2 (- 2 1))
= (* 2 1)
= 2

如果将该表达式采用树形表示,其求值顺序按“最左最内/leftmost innermost”方式求值,也称应用序 (Applicative order,实用序)求值或饥饿求值(序同后序、前序的序)。先求最左的*,这是操作符*,后面是其参数;然后对各个参数求值。递归地,找到最内部的表达式先求得结果。

对于函数调用,通常也是应用序求值。简单地说,函数调用时先计算所有实参的值

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

(square (+ 1 2))

=(square 3)

= (* 3 3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值