Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pol_Grem_-_ANSI_Common_Lisp_High_tech_-_2012.pdf
Скачиваний:
28
Добавлен:
12.03.2016
Размер:
4.85 Mб
Скачать

128

Глава 6. Функции

Итера­тив­ная­ версия­ менее­ понят­на,­ зато­ намно­го­ более­ эффек­тив­на­. Как часто­ на практи­ке­ имеют­ место­ такие­ разли­чия?­ Очень редко,­ и именно­ поэто­му­ в различ­ных­ книгах­ при­водит­ся­ один и тот же при­мер. Тем не менее­ таких­ ситуа­ций­ следу­ет­ осте­ре­гать­ся­.

Итоги главы

1.Имено­ван­ная­ функция­ хранит­ся­ как symbol-function соот­вет­ст­вую­­ щего­ сим­вола­. Макрос­ defun скры­вает­ подоб­ные­ дета­ли­. Кроме­ того,­ он позво­ля­ет­ сопро­во­ж­дать­ функции­ доку­мен­та­ци­ей,­ а также­ на­ страивать­ пове­де­ние­ setf.

2.Имеет­ся­ возмож­ность­ опре­де­лять­ локаль­ные­ функции;­ этот процесс­ напо­ми­на­ет­ опре­де­ле­ние­ локаль­ных­ пере­мен­ных­.

3.Функции­ могут­ иметь необя­за­тель­ные­ и оста­точ­ные­ аргу­мен­ты,­ а также­ аргу­мен­ты­ по ключу­.

4.Утили­ты­ допол­ня­ют­ язык. Они представ­ля­ют­ собой­ пример­ про­ грамми­ро­ва­ния­ снизу­-вверх в малень­ком­ масшта­бе­.

5.Лекси­че­ские­ пере­мен­ные­ суще­ст­ву­ют­ до тех пор, пока­ на них ссыла­­ ется­ какой­-либо­ объект­. Замы­ка­ния ­– это функции,­ ссылаю­щие­ся­ на свобод­ные­ пере­мен­ные­. Вы може­те­ само­стоя­тель­но­ опре­де­лять­ функции,­ возвра­щаю­щие­ замы­ка­ния­.

6.Dylan предос­тав­ля­ет­ функции­ для построе­ния­ других­ функций­. С ис­ пользо­ва­ни­ем­ замы­ка­ний­ мы легко­ можем­ реали­зо­вать­ их в Common­ Lisp.

7.Специ­аль­ные­ пере­мен­ные­ имеют­ дина­ми­че­ский­ диапа­зон­.

8.Функции­ могут­ компи­ли­ро­вать­ся­ инди­ви­ду­аль­но­ или (чаще)­ в со­ ставе­ файла­.

9.Рекур­сив­ный­ алго­ритм­ реша­ет­ зада­чу­ разде­ле­ни­ем­ ее на конеч­ное­ число­ похо­жих­ подза­дач­ меньше­го­ разме­ра­.

Упражнения

1.Опре­де­ли­те­ версию­ tokens (стр. 81), кото­рая­ исполь­зу­ет­ ключи­ :test

и:start, по умолча­нию­ равные­ #’constituent и 0 соот­вет­ст­вен­­но.

2.Опре­де­ли­те­ версию­ bin-search (стр. 75), исполь­зую­щую­ ключи­ :key, :test, :start и :end, имеющие­ обычные­ для них значе­ния­ по умолча­­ нию.

3.Опре­де­ли­те­ функцию,­ прини­маю­щую­ любое­ коли­че­ст­во­ аргу­мен­тов­

ивозвра­щаю­щую­ их коли­че­ст­во­.

4.Изме­ни­те­ функцию­ most (стр. 118) так, чтобы­ она возвра­ща­ла­ два зна­ чения – два элемен­та,­ имеющие­ наиболь­ший­ вес.

5.Опре­де­ли­те­ remove-if (без аргу­мен­тов­ по ключу)­ с помо­щью­ filter (стр. 117).

Упражнения

129

6.Опре­де­ли­те­ функцию,­ прини­маю­щую­ одно­ число­ и возвра­щаю­щую­ наиболь­шее­ число­ из всех ранее­ полу­чен­­ных ею.

7.Опре­де­ли­те­ функцию,­ прини­маю­щую­ одно­ число­ и возвра­щаю­щую­ его же, если­ оно больше­ числа,­ пере­дан­но­го­ этой функции­ на преды­­ дущем­ вызо­ве­. Во время­ перво­го­ вызо­ва­ эта функция­ долж­на возвра­­ щать nil.

8.Предпо­ло­жим,­ что функция­ expensive имеет­ один аргу­мент ­– целое­ число­ между­ 0 и 100 включи­тель­но­. Она произ­во­дит­ сложные­ и до­ рого­стоя­щие­ вычис­ле­ния­. Опре­де­ли­те­ функцию­ frugal, возвра­щаю­­ щую тот же ответ,­ что и expensive, но вызы­­вающую­ expensive, лишь когда­ ей пере­да­ет­ся­ аргу­мент,­ кото­рый­ не встречал­ся­ ранее­.

9.Опре­де­ли­те­ функцию­ напо­до­бие­ apply, но где все числа,­ кото­рые­ мо­ гут быть напе­ча­та­ны­ при ее выпол­не­нии,­ выво­дят­ся­ в восьме­рич­ном­ форма­те­ (base 8).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]