Cla*_*ton 0 lisp scheme scope lexical
我知道该方案是一个词法范围/静态范围的语言,但我不明白为什么这两个代码块返回不同的结果.
(define a 100)
(let ((z 20))
(lambda (a b) (+ a b)) a z)
Run Code Online (Sandbox Code Playgroud)
20
(define a 100)
(let ((z 20))
(lambda (a b) (+ a b)) z a)
Run Code Online (Sandbox Code Playgroud)
100
两个代码块都有类似的语法.一个词法变量,z包含两行死代码和一个尾部位置的表达式,它们成为了结果let.例如.
(let ((z 20))
(lambda (a b) (+ a b)) ; evaluates to a procedure and thrown away
a ; evaluated to 100 and thrown away
z) ; evaluated to 20. in tail so the result of let
Run Code Online (Sandbox Code Playgroud)
第二个是非常相似的:
(let ((z 20))
(lambda (a b) (+ a b)) ; evaluates to a procedure and thrown away
z ; evaluated to 20 and thrown away
a) ; evaluated to 100. In tail so the result of let
Run Code Online (Sandbox Code Playgroud)
请注意,lambda从不应用(调用)计算过程的程序.打电话给他们,例如.使用其他表达式作为参数,您会得到完全不同的结果:
(let ((z 20))
; calls the anonymous lambda with agruments a and z
((lambda (a b) (+ a b)) a z)) ; ==> 120
Run Code Online (Sandbox Code Playgroud)
括号在这种语言中很重要.太少了,你会得到单独的表达式,其中最后一个是结果.太多了,你不小心应用了非程序的值.
另请注意,在动态范围的lisp中,您将得到相同的结果.然而在这:
(define n 100)
(define (make-incer n)
(lambda (x)
(+ n x)))
(define inc10 (make-incer 10))
(inc10 5)
; ==> 15 (lexically scoped)
; ==> 105 (dynamicly scoped)
Run Code Online (Sandbox Code Playgroud)
原因是dymamicly coped语言没有闭包,因此n在make-incer返回过程时不存在,因此n是全局绑定或更接近的调用时间绑定,如下所示:
(let ((n 5))
(inc10 20))
; ==> 30 (lexically scoped)
; ==> 25 (dynamically scoped)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |