对于表达式
(define x (length (range 3000)))
我认为它的评估结果是
(define x 3000)
对于表达式
(define (f x) (length (range 3000)))
它也可以评估以下内容吗?
(define (f x) 3000)
答案 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
是不同的对象,即使它们计算的值相同。