SICP: Нестрогие или ленивые «минусы», как это работает?

Ниже приведен отрывок из книги SICP, раздел 4.2.3 Потоки как отложенные списки:

При ленивом вычислении потоки и списки могут быть идентичными, поэтому нет необходимости в специальных формах или отдельных операциях со списками и потоками. Все, что нам нужно сделать, это упорядочить все так, чтобы cons не было строгим. Один из способов добиться этого — расширить ленивый вычислитель, чтобы он позволял использовать нестрогие примитивы, и реализовать cons как один из эти. Легче всего напомнить (раздел 2.1.3), что нет принципиальной необходимости реализовывать cons как примитив. Вместо этого мы можем представить пары как процедуры:

(define (cons x y)
    (lambda (m) (m x y)))
(define (car z)
    (z (lambda (p q) p)))
(define (cdr z)
    (z (lambda (p q) q)))

Вопрос: я не понимаю, как приведенное выше определение cons обеспечивает ленивое или нестрогое поведение. Например, следующий вызов cons,

(define (foo) '(1 2 3))
(define bar (cons 'a (foo)))

действительно приводит к вызову foo в момент вызова cons, что не является ленивым или строгим поведением.

Итак, как бы мы написали ленивую или нестрогую версию cons, которая также не является особой формой.


person Harry    schedule 02.03.2017    source источник
comment
В этом разделе предполагается, что код оценивается ленивым оценщиком из предыдущего раздела 4.2.2.   -  person molbdnilo    schedule 02.03.2017
comment
Хм. Я несколько подозревал, что то, что вы здесь говорите, имело место, но не был полностью уверен. Например, приведенный выше раздел 4.2.3 мотивирует проблему, с которой столкнулись в более раннем разделе 3.5.1, где, по словам авторов, должны были обязательно использоваться специальные формы delay и cons-stream. Это звучало так, как будто авторы пытаются избавиться от специальных форм ВНЕ оценщика в текущем разделе 4.2.3.   -  person Harry    schedule 02.03.2017
comment
@molbdnilo Если вы можете опубликовать свой комментарий в качестве ответа, я сделаю его окончательным.   -  person Harry    schedule 04.03.2017


Ответы (1)


В этом разделе предполагается, что код оценивается ленивым оценщиком из предыдущего раздела 4.2.2. – molbdnilo, на 02 март 2017, в 7:49.

person Community    schedule 25.04.2019