Что оценивает выражение (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Это разные объекты, хотя значения, которые они вычисляют, одинаковы.

Другие вопросы по тегам