Я определил простой ленивый список всех целых чисел с нуля:
(define integers-from
(lambda (n)
(cons n
(lambda () (integers-from (+ 1 n))))))
(define lz (integers-from 0))
Я также закодировал аккумулятор, который получает ленивый список в качестве параметра
(define lz-lst-accumulate
(lambda (op initial lz)
(if (null? lz)
initial
(cons (op (head lz) initial)
(lambda () (lz-lst-accumulate op (op initial (head lz)) (tail lz)))))))
Отвечает ли этот аккумулятор формату ленивых списков? Вот простой тест аккумулятора:
(define acc (lz-lst-accumulate * 1 lz))
(take acc 4)
=> '(1 2 6 24)
take
- вспомогательная функция, которая создает список из первых n
элементов ленивого списка:
(define head car)
(define tail
(lambda (lz-lst)
((cdr lz-lst)) ))
(define take
(lambda (lz-lst n)
(if (= n 0)
(list)
(cons (car lz-lst)
(take (tail lz-lst) (sub1 n)))) ))
(cons a b)
, и(cons b a)
не могут дать одинаковых результатов. 24.04.2014