表达式 (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 是不同的对象,即使它们计算的值是相同的