(let ((+ *) (* +))
(+ 3 (* 4 5)))
步出某事:
(define +_0 *)
(define *_0 +)
(+_0 3 (*_0 4 5))
一切都很清楚但我为什么会发生+ _0?我的眼睛应该是:
(define + *)
(define * +)
(+_0 3 (* 4 5))
答案 0 :(得分:2)
define
与let
不完全相同。在let
中,在绑定发生之前评估值,而使用define
时,它会绑定到未定义的值并且它会隐藏原始过程。扩展确保变量不会通过使用表单中的其他符号来遮蔽它们设置的值。
尝试运行这些:
(let ()
(define + *)
(define * +)
(+ 3 (* 4 5))) ; * and + are undefined so this will fail
(let ()
(define + *)
(define * +)
(list + *)) ; ==> (#<undefined> #<undefined>)
允许(let ((x 10)(* +)) (* x x)) ; ==> 20
评估与((lambda (x *) (* x x)) 10 +)
相同,最后一个{†10
和+
在分配到{{1}之前进行评估}和x
在过程中。