Нет, они оценивают две разные процедуры, с разными органами.Совершенно другое дело, что при выполнении они оба возвратят одно и то же значение, а именно 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
являются разными объектами, даже если вычисляемые ими значения одинаковы.