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

时间:2018-09-27 04:52:26

标签: racket evaluate

对于表达式

(define x (length (range 3000)))

我认为它的评估结果是

(define x 3000)

对于表达式

(define (f x) (length (range 3000)))

它也可以评估以下内容吗?

(define (f x) 3000)

1 个答案:

答案 0 :(得分:1)

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

(define f
  (lambda (x) (length (range 3000))))

第二个表达式还将f绑定到lambda,但这是一个不同的表达式:

(define f
  (lambda (x) 3000))

任何一个在被调用时都将返回3000

(f 42)
=> 3000

但是第一个将做更多的工作,它必须创建一个range并计算其length,而第二个仅返回3000。关于您的第一个示例-最后的x将具有相同的值,并且计算方式无关紧要。但是对于第二个示例,两个f是不同的对象,即使它们计算的值相同。