球拍,踏步机,我不明白一件事

时间:2014-04-06 22:51:30

标签: racket

(let ((+ *) (* +))
  (+ 3 (* 4 5)))

步出某事:

(define +_0 *)
(define *_0 +)
(+_0 3 (*_0 4 5))

一切都很清楚但我为什么会发生+ _0?我的眼睛应该是:

(define + *)
(define * +)
(+_0 3 (* 4 5))

1 个答案:

答案 0 :(得分:2)

definelet不完全相同。在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在过程中。