Что оценивает выражение (define (f x) (length (range 3000)))?
Для выражения
(define x (length (range 3000)))
Я думаю, что это оценивается в
(define x 3000)
Для выражения
(define (f x) (length (range 3000)))
Это также оценивает следующее?
(define (f x) 3000)
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
Это разные объекты, хотя значения, которые они вычисляют, одинаковы.