Page 32

ПРО

№13 (апрель) 2011

граммист

НОВОСТИ ПО интересная fold (свертка). Первые

три

диссонанса

не

при

На

вызывают

обработке

императивно-декларативном

когнитивного

их

в

моем

разуме,

они

выполняют вполне естественные для своего названия действия***.

Ну, тут все просто, find принимает функцию и Вообще,

find-filled

подается

список

lstlst

списков (кстати, пока не проверяется, каждый ли

элемент

lstlst

является

списком).

Возвращается первый элемент списка lstlst, который является непустым списком.

Тавтология здесь неизбежна. Чтобы понять рекурсию, надо понять рекурсию.

Find список.

вход

надо

привыкать,

что

передавать функцию в другую функцию – это норма. find применяет функцию к элементам

списка (начинает слева и идет дальше) и

возвращает тот элемент, для которого эта

Вот пример для разрядки ситуации: (display (find-filled '( () () (a b c) (a) () ) ) )

функция впервые вернет #t (true).

Программа напечатает (a b c).

Возможная реализация find:

Filter filter работает как find, с той лишь разницей,

(define (find func lst)

что он возвращает список из всех элементов,

(if (null? lst)

удовлетворяющих условию func, то есть func

'()

на этих элементах вернет #t:

(if (func (car lst)) (car lst) (find func (cdr lst))

(define (_filter func lst accum)

)

(if (null? lst)

)

accum

)

(if (func (car lst)) (cons (car lst) (_filter func (cdr lst) accum ) )

Все просто, если на входе пустой список – возвращаем применяем

пустой

функцию

список. к

Если

первому

нет

(_filter func (cdr lst) accum)

элементу

) )

входного списка. Если функция вернет #t,

)

вызываем себя же для остатка списка.

(define (filter func lst)

возвращаем

этот

элемент.

Если

нет

(define (check-not-null lst) (not (null? lst)) ) (define (find-filled lstlst) (find check-not-null lstlst) )

*** А вернее сказать, возвращают ожидаемый результат. Императивное слово «действие» надо бы вообще не использовать, когда речь идет о функциональном программировании.

(_filter func lst '() ) )

Очень полезно для мозга разбираться в том, как

работают

эти

функции.

Все

просто:

строим в голове стек, списки, снабжаем это красивой графикой (а-ля фильмы про крутых

32

PROgrammist, №13  

Official editorial layout

PROgrammist, №13  

Official editorial layout

Advertisement