Определение фильтра в учебнике - это (нехвостое) рекурсивное определение, которое показали другие авторы, и важно понять это.Однако, если вы пишете это как библиотечную функцию, полезно выяснить, как это сделать с помощью хвостовой рекурсии, чтобы не разбивать стек или кучу длинными списками:
(define (filter pred? list)
(define (filter-aux result current-pair xs)
(cond ((null? xs)
result)
((pred? (car xs))
(set-cdr! current-pair
(cons (car xs)
'()))
(filter-aux result
(cdr current-pair)
(cdr xs)))
(else
(filter-aux result
current-pair
(cdr xs)))))
(let ((init (cons 'throw-me-out '())))
(filter-aux (cdr init) init list)))
Или, используя синтаксис let loop
:
(define (filter pred? xs)
(let ((result (cons 'throw-me-out '()))
(xs xs))
(let loop ((current-pair result))
(cond ((null? xs)
(cdr result))
((pred? (car xs))
(set-cdr! current-pair
(cons (car xs) '()))
(loop (cdr current-pair) (cdr xs)))
(else
(loop current-pair (cdr xs)))))))