Мне сложно понять, что происходит с примером Little Schemer evens-only*&co
на стр. 145.
Здесь код:
(define evens-only*&co
(lambda (l col)
(cond
((null? l)
(col '() 1 0))
((atom? (car l))
(cond
((even? (car l))
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col (cons (car l) newl)
(opx (car l) product)
sum))))
(else
(evens-only*&co (cdr l)
(lambda (newl product sum)
(col newl product (op+ (car l) sum)))))))
(else
(evens-only*&co (car l)
(lambda (newl product sum)
(evens-only*&co (cdr l)
(lambda (dnewl dproduct dsum)
(col (cons newl dnewl)
(opx product dproduct)
(op+ sum dsum))))))))))
Начальный col
может быть:
(define evens-results
(lambda (newl product sum)
(cons sum (cons product newl))))
То, что я не получаю, с l
как '((1) 2 3)
, немедленно переходит в окончательный else
с (car l)
как (1)
и (cdr l)
как (2 3)
. Хорошо, но мой разум пуст, пытаясь разобрать dnewl
, dproduct
, dsum
из newl
, product
, sum
. Было бы также полезно, если бы кто-нибудь мог меня обучить тому, как настроить DrRacket или Chez Scheme или MIT-Scheme для запуска шага.
Но, возможно, я слишком рано размахиваю. Является ли какой-либо новичок, читающий это в первый раз, фактически должен понимать это дикое продолжение?