Racket 表达式(定义(f x)(长度(范围3000))的计算结果是什么?

Racket 表达式(定义(f x)(长度(范围3000))的计算结果是什么?,racket,evaluate,Racket,Evaluate,为了表达 (define x (length (range 3000))) 我认为它被评估为 (define x 3000) 为了表达 (define (f x) (length (range 3000))) 其评估结果是否也符合以下要求 (define (f x) 3000) 不,他们评估两种不同的程序,不同的机构。一个完全不同的问题是,当执行时,它们都将返回相同的值,即3000,在这两种情况下都忽略参数。需要说明的是,第一个表达式将f绑定到lambda(这就是define在引擎盖下扩

为了表达

(define x (length (range 3000)))
我认为它被评估为

(define x 3000)
为了表达

(define (f x) (length (range 3000)))
其评估结果是否也符合以下要求

(define (f x) 3000)

不,他们评估两种不同的程序,不同的机构。一个完全不同的问题是,当执行时,它们都将返回相同的值,即
3000
,在这两种情况下都忽略参数。需要说明的是,第一个表达式将
f
绑定到
lambda
(这就是
define
在引擎盖下扩展过程定义的方式):

第二个表达式也将
f
绑定到
lambda
,但它是另一个表达式:

(define f
  (lambda (x) 3000))
调用时,其中一个将返回
3000

(f 42)
=> 3000

但是第一个将做更多的工作,它必须创建一个
范围
并计算其
长度
,而第二个只返回
3000
。关于您的第一个示例,最终
x
将具有相同的值,并且不管您如何计算它。但对于第二个示例,两个
f
s是不同的对象,即使它们计算的值相同。

您是否解释了
(定义(fx)(长度(范围3000))
?我很困惑。对不起,我解释了你的第二个例子,请再读一遍。我在帖子中回答了一个问题:“它是否也评估了以下内容?”TL;DR:不,它们对不同的过程求值,即使调用时它们的值看起来是相同的
f
是一个过程,
x
是一个值。嗯,不确定我是否得到它。那么
(定义(fx)(长度(范围3000))
是一种懒惰的评估吗?在您的解释中,
(定义f(lambda(x)(长度(范围3000)))
在调用函数之前,它不会计算
(长度(范围3000))
不是吗?它不是惰性计算,您定义了两个不同的函数,每个函数都有一个参数和一个主体。直到你调用它,它才有一个值,这与任何其他编程语言一样,函数只是一系列指令,它们被计算并仅在调用时返回一个值(如果有的话)。要回答标题中的问题:表达式
(define(f x)…)
计算为一个过程对象,它只会在您实际调用它之后返回
3000
(f 42)
=> 3000