表达式 (define (f x) (length (range 3000))) 的计算结果是什么?
What does the expression (define (f x) (length (range 3000))) evaluate to?
对于表达式
(define x (length (range 3000)))
我认为它被评估为
(define x 3000)
对于表达式
(define (f x) (length (range 3000)))
它是否也评估为以下内容?
(define (f x) 3000)
不,他们评估两个不同的程序,不同的机构。一个完全不同的事情是,在执行时,它们都将 return 相同的值,即 3000
,忽略两种情况下的参数。明确地说,第一个表达式将 f
绑定到 lambda
(这就是 define
在幕后扩展过程定义的方式):
(define f
(lambda (x) (length (range 3000))))
第二个表达式也将 f
绑定到 lambda
,但它是不同的:
(define f
(lambda (x) 3000))
任何一个在调用时都会 return 3000
:
(f 42)
=> 3000
但是第一个会做更多的工作,它必须创建一个 range
并计算它的 length
,而第二个只是 returns 3000
。关于您的第一个示例 - 最后 x
将具有相同的值,并且您如何计算它并不重要。但是对于第二个例子,两个 f
是不同的对象,即使它们计算的值是相同的
对于表达式
(define x (length (range 3000)))
我认为它被评估为
(define x 3000)
对于表达式
(define (f x) (length (range 3000)))
它是否也评估为以下内容?
(define (f x) 3000)
不,他们评估两个不同的程序,不同的机构。一个完全不同的事情是,在执行时,它们都将 return 相同的值,即 3000
,忽略两种情况下的参数。明确地说,第一个表达式将 f
绑定到 lambda
(这就是 define
在幕后扩展过程定义的方式):
(define f
(lambda (x) (length (range 3000))))
第二个表达式也将 f
绑定到 lambda
,但它是不同的:
(define f
(lambda (x) 3000))
任何一个在调用时都会 return 3000
:
(f 42)
=> 3000
但是第一个会做更多的工作,它必须创建一个 range
并计算它的 length
,而第二个只是 returns 3000
。关于您的第一个示例 - 最后 x
将具有相同的值,并且您如何计算它并不重要。但是对于第二个例子,两个 f
是不同的对象,即使它们计算的值是相同的