Что оценивает выражение (define (fx) (длина (диапазон 3000)))? - PullRequest
0 голосов
/ 27 сентября 2018

Для выражения

(define x (length (range 3000)))

Я думаю, что оно оценивается как

(define x 3000)

Для выражения

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

Оценивает ли оно также следующее?

(define (f x) 3000)

1 Ответ

0 голосов
/ 27 сентября 2018

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

...