2011-04-23 36 views
1

我看到之前有类似的问题,但我不明白这里的另一个问题。方案 - 使用let的函数

这里有两个功能:

(define x 2) 
(define a 2) 

(define goo 
    (lambda (x) 
    (display x) 
    (lambda (y) (/ x y)))) 

(define foo 
    (let ((f (goo a))) 
    (lambda (x) 
     (if (= x 0) 
      x 
      (f x))))) 

什么是(foo (foo 0))的返回值?什么会打印到屏幕上?

据我了解,当我在开始运行(foo 0)2将打印出来(我们将进入功能goo),并且返回值将是0。然后,我们将再次输入foo的功能(foo (foo 0)) =>(foo 0)。我们再次输入功能goo2将打印出来。但是当我运行它时,2只被打印一次。我想我错过了关于let及其与lambda的连接的关键问题。

回答

2

letfoo定义内,并且因此gooa应用程序中,当foo被定义,而不是当foo评价进行评价。

看看这样:foo的价值是什么?这是lambda表达式。 f的绑定关闭了foo,它不是每次对foo进行评估时“重做”。

编辑:这里是一个例子,而不lambda小号

> (let ((x (sqrt 2))) (* x 3)) 
4.24264068711929 
> (define bar (let ((x (sqrt 2))) (* x 3))) 
> bar 
4.24264068711929 
>   

当你评估bar你是不是再次调用sqrtbar被定义为let的主体,在这种情况下是表达式的结果。

在您的示例中,let的正文是lambda表达式。但就像我的例子,绑定不会被重新执行。

+0

Tank u。但“let”的正文是: (lambda(x) (if(= x 0) x (f x))) 含义 - 我必须在每次评估“foo”时输入let。因此,我也输入了“goo”功能(重新定义)。 我缺少什么? – Tom 2011-04-23 15:38:16

+0

当x不为零时,再次评估f;但f是foo定义时评估(goo a)的结果; f已经绑定,每次执行foo时都不会反弹。 – 2011-04-23 15:52:58

+0

看到我的编辑上面的例子,可能会帮助你。 – 2011-04-23 16:03:44