Skip to content

Evaluation

wzs edited this page Aug 27, 2018 · 1 revision

求值策略

问题

  1. 以下函数的执行结果(主要是 calc("1", a, calc("10", a, b)) )
    func calc(index string, a, b int) int {
        ret := a + b
        fmt.Println(index, a, b, ret)
        return ret
    }
    func main() {
        a := 1
        b := 2
        defer calc("1", a, calc("10", a, b))
        a = 0
        defer calc("2", a, calc("20", a, b))
        b = 1
    }

定义

  1. 求值策略(Evaluation strategy) 是 确定 编程语言中 表达式的求值 的一组规则; 求值策略定义了 在什么时间 以什么次序 对函数的实参 如何求值, 并且 什么时候代换入函数, 以及以何种方式生.
  2. 基于如何处理函数实参, 求值策略 分为两大类: 严格求值 / 非严格求值

严格求值

  1. 严格求值: 函数实参在函数调用前就求值
    • 多数语言都是用严格求值
    • 通俗讲, 严格求值就是 执行到函数调用时, 如果函数参数中有表达式, 则立即计算表达式的值, 然后将该值入栈, 在函数执行时使用此值.(引用类型保证传入的地址不变, 值类型保证传入的值不变)
    • 严格求值也称 热情求值
  2. 定义
    • 在什么时间: 函数调用前.
    • 什么次序: 后序遍历: 以二叉树距离, 就是 先从左子树, 叶子层开始, 逐次遍历.
    • 如何求值

如何求值

  • 传值调用: 参数是传入值的值拷贝.
  • 传引用调用: 传递给函数的是传入值的隐式引用而不是值拷贝.
    • 有些语言使用指针模拟引用传递. 所以传引用调用 有时也称 传地址调用.
  • 传共享对象引用: 函数参数和传入值 共享一个对象, 不发生拷贝, 两者是一个值.
    • Python, Java对象类型 使用 传共享对象引用
  • 传附件-恢复调用: 特殊情况, 不写了.
  • 部分求值: 暂时不写.

非严格求值

  1. 非严格求值: 不主动对函数实参求值, 除非该实参在函数体内被使用, 也称惰性求值.
  2. 定义
    • 在什么时间: 惰性求值
    • 什么次序: 正常次序, 既最左最外, 总是先求最外层的表达式. 以二叉树举例, 就是从左侧根部开始.
    • 如何求值

如何求值

  • 传名引用: 如果实际参数在函数的求值中未被用到, 则它永不被求值; 如果这个实际参数使用多次, 则它每次都被重新求值

引用

名词解释

  1. 实参: 调用函数时, 传递给函数的参数.
    • 形参: 函数签名中函数的参数. 形式参数.
Clone this wiki locally