схема - функция с пусть - PullRequest
       9

схема - функция с пусть

1 голос
/ 23 апреля 2011

Я видел, что подобный вопрос задавался ранее, но я не понимаю другой проблемы здесь.

Вот две функции:

(define x 2)
(define a 2)

(define goo
  (lambda (x)
    (display x)
    (lambda (y) (/ x y))))

(define foo
  (let ((f (goo a)))
    (lambda (x)
      (if (= x 0)
          x
          (f x)))))

Что такое возвращаемое значение (foo (foo 0))? Что будет выводить на экран?

Насколько я понимаю, при запуске (foo 0) в начале будет напечатано 2 (мы введем функцию goo), и возвращаемое значение будет 0. Затем мы снова введем функцию foo с (foo (foo 0)) => (foo 0). Мы снова введем функцию goo и 2 распечатаем. Но когда я запускаю его, 2 печатается только один раз. Я думаю, что мне не хватает критической проблемы о let и его связи с lambda.

1 Ответ

2 голосов
/ 23 апреля 2011

let внутри определения foo и, следовательно, применение от goo до a, оценивается, когда определено foo, а не когда foo.

Посмотрите на это так: какова ценность foo? Это выражение lambda. Привязка f закрывается foo, она не «переделывается» каждый раз, когда foo оценивается.

Редактировать: вот пример без lambda s

> (let ((x (sqrt 2))) (* x 3))
4.24264068711929
> (define bar (let ((x (sqrt 2))) (* x 3)))
> bar
4.24264068711929
>        

Когда вы оцениваете bar, вы больше не звоните sqrt. bar определяется как тело let, в данном случае это число, являющееся результатом выражения.

В вашем примере тело let является выражением lambda. Но, как и в моем примере, привязка let не выполняется повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...