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