1

我正在复习我的低球拍知识,并在球拍出色的帖子中遇到了这个流。我的问题是关于这个片段:

(define powers-of-two
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
        (lambda () (f 2))))

我理解“内部 lambdas”的原因,但为什么 OP 对整个函数使用 lambda?难道不能像这样有效地完成吗?

(define (powers-of-two)
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
       (f 2)))

我进行了实验,没有发现任何区别。我的问题是这是否只是风格问题,或者是否有某种理由认为前者更可取。

4

2 回答 2

3

没有区别。由于f在第二个示例中没有关闭任何东西,因此可以将其提升到powers-of-two函数之外,这等效于第一个示例。

第一个可能更可取的一个原因是只f需要创建一个函数。对于第二个,f每次有人调用时都会创建一个新函数(powers-of-two)

不过,我尝试对它们进行计时,但两者都没有比另一个快得多。

于 2015-11-16T02:01:27.503 回答
2
(define (name arg)
   arg)

这是写作的简短形式:

(define name 
   (lambda (arg)
      arg))

所以第一个例子发生的事情是 letrect 立即发生并且返回的函数将(lambda () (f 2))f它的闭包中。

第二个创建一个名为powers-of-twothat 的过程,应用时(powers-of-two)将返回与第一个相同的powers-of-two过程。将其视为powers-of-two-generator.

因此:

(define powers-of-two
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
        (lambda () (f 2))))

(define (powers-of-two-generator)
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
       (f 2)))

(powers-of-two) ; ==> (2 . procedure)

(define powers-of-two2 (powers-of-two-generator)) ; ==> procedure

(powers-of-two2) ; ==> (2 . procedure)

你看得到差别吗?

于 2013-10-30T22:10:00.920 回答