WWW.BOOK.LIB-I.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Электронные ресурсы
 
s

Pages:     | 1 |   ...   | 2 | 3 ||

«По договору между издательством «Символ-Плюс» и Интернет-магазином «Books.Ru – Книги России» единственный легальный способ получения данного файла с книгой ISBN ...»

-- [ Страница 4 ] --

1. Теперь тип fixnum имеет размер не менее 16 бит.

2. Добавлены восемь новых констант, ограничивающих допустимые значения нормализованных чисел с плавающей запятой.

3. Добавлен тип real; он является подтипом для number и надтипом для rational и float.

Пакеты

1. Изменено соглашение о способе определения пакетов в файлах с исходными кодами. Вызовы функций, связанных с пакетами, из toplevel больше не обрабатываются компилятором. Вместо этого введен рекомендованный к использованию макрос defpackage. Старая функция in-package заменена на макрос с тем же именем. Новый макрос не вычисляет свой аргумент, не принимает аргумент :use и не создает пакеты неявно.

2. Пакеты lisp и user переименованы в common-lisp и common-lisp-user.

Вновь создаваемые пакеты не используют common-lisp по умолчанию, как это происходило с пакетом lisp.

3. Имена встроенных переменных, функций, макросов и специальных операторов принадлежат common-lisp. Попытка переопределения, свяПриложение C зывания, трассировки и деклараций применительно к любым встроенным операторам считается ошибкой.

Типы

1. Добавлен спецификатор типов eql.

2. Удален тип common и функция commonp.

–  –  –

чечные списки могут быть аргументами nconc. (Странно, что аргументами append должны быть правильные списки, то есть nconc и append теперь принимают неодинаковые аргументы.)

7. Теперь невозможно преобразовывать integer в character с помощью coerce. Добавлена возможность преобразования (setf f) в функцию с помощью coerce.

8. Ослаблено ограничение, согласно которому аргумент compile должен быть определен в нулевом лексическом окружении; теперь окружение может содержать определения и декларации локальных макросов или символов-макросов. Также первым аргументом теперь может быть уже скомпилированная функция.

9. Функции gentemp и set признаны нежелательными.

10. Символ type в декларациях типов может быть опущен. Таким образом, ошибкой является определение типа с таким же именем, как и декларация, и наоборот.

11. Новая декларация ignorable может использоваться, чтобы избавиться от предупреждений, независимо от того, используется переменная или нет.

12. Константа array-total-size-limit теперь задана как тип fixnum. Поэтому аргумент row-major-aref можно всегда объявлять как fixnum.

13. Вместо :print-function структура, определяемая через defstruct, может иметь :print-object, который принимает только первые два аргумента.

14. Введен новый тип boolean, которому принадлежат только nil и t.

D Справочник по языку Приложение D.

Это приложение описывает каждый оператор в ANSI Common Lisp.

Мы будем следовать ряду соглашений:

Синтаксис Описания функций представлены списком, начинающимся с имени функции, за которым следуют описания ее параметров. Описания специальных операторов и макросов являются регулярными выражениями, показывающими внешний вид корректного вызова.

В этих регулярных выражениях звездочка1, следующая за объектом, означает, что объект повторяется ноль и более раз: (a*) может соответствовать (), (a), (a a) и т. д. Объект в квадратных скобках соответствует его присутствию ноль или один раз: (a [b] c) может быть (a c) или (a b c).

Иногда для группировки используются фигурные скобки: ({a b}*) может соответствовать (), (a b), (a b a b) и т. д. Вертикальная черта означает выбор между несколькими альтернативами: (a {1 | 2} b) может быть (a 1 b) или (a 2 b).





Имена параметров Имена параметров соответствуют ограничениям на аргументы. Если параметр имеет имя, идентичное имени некоторого типа, то соответствующий аргумент может принадлежать только к этому типу. Ряд других имен (с описаниями) перечислен в таблице ниже.

Аргументы макросов и специальных операторов не вычисляются до тех пор, пока это не будет явно указано в описании. Если такой аргумент не вычисляется, ограничения на тип задаются его именем применительно Надстрочный знак * в регулярных выражениях не следует путать с *.

Справочник по языку к самому аргументу, а если вычисляется, то применительно к его значению. Аргумент макроса вычисляется в том окружении, где встречается макровызов, если в описании явно не сказано другое.

–  –  –

Умолчания Некоторые необязательные параметры всегда имеют определенные значения по умолчанию. Необязательный параметр stream всегда по умолчанию имеет значение *standard-input* или *standard-output* в зависимости от направления потока. Необязательный параметр package по умолчанию установлен в *package*; readtable всегда установлен в *readtable*, а pprint-dispatch – в *print-pprint-dispatch*.

Сравнение Многие функции, сравнивающие элементы последовательностей, принимают следующие аргументы по ключу: key, test, test-not, from-end, start или end. Они всегда используются одинаково (стр. 79). Параметры key, test и test-not должны быть функциями, start и end – неотрицательными целыми числами. В описании таких функций слова «сравнивает», «член» и «элемент» следует понимать с учетом влияния подобных аргументов.

В любой функции, сравнивающей элементы последовательности, предикатом сравнения по умолчанию является eql.

Структура Если оператор возвращает структуру (например, список), необходимо помнить, что возвращаемое значение может разделять структуру с объектами, переданными в качестве аргументов, до тех пор, пока в описании оператора не будет явно указано, что это значение является вновь созданной структурой. Однако при вызове функции могут быть модифицированы лишь параметры, заключенные в угловые скобки (list).

Если две функции перечисляются одна за другой, это значит, что вторая является деструктивным аналогом первой.

–  –  –

body-clause может быть предложением любого типа, за исключением named, with или for. Каждое из этих предложений описывается ниже.

Соглашения: Элементы предложений не вычисляются до тех пор, пока в описании об этом не будет сказано явно. Слово type означает декларацию типа; это может быть отдельный спецификатор типа или дерево спецификаторов, которые связываются с соответствующими элементами списка по деструктуризации.

Синонимы: Макрос loop активно использует синонимы многих ключевых слов. В следующих парах ключей второй является полноценной заменой первому: upfrom, from; downfrom, from; upto, to; downto, to;

the, each; of, in; when, if; hash-keys, hash-key; hash-value, hash-values; symbol, symbols; present-symbol, present-symbols; external-symbol, externalsymbols; do, doing; collect, collecting; append, appending; nconc, nconcing;

count, counting; sum, summing; maximize, maximizing; minimize, minimizing.

named symbol Делает заданный символ symbol именем блока, в который заключается loop-выражение.

with var1 [type1] = expression1 {and var [type] = expression}* Связывает каждую переменную var со значением соответствующего выражения expression, делая это параллельно, как с помощью let.

initially expression1 expression* Вычисляет выражения по порядку как часть loop-пролога.

finally expression1 expression* Вычисляет выражения по порядку как часть loop-эпилога.

for var [type1] for-rest1 {and var [type] for-rest}* Связывает каждую переменную var со значением, получаемым из соответствующего for-rest на каждой последующей итерации. Использование нескольких for-предложений, связанных через and, приведет к параллельному обновлению значений переменных, как в do.

Возможные формы для for-rest выглядят следующим образом:

[upfrom start] [{upto | below} end] [by step] Как минимум одно из этих трех подвыражений должно быть задействовано. Если используется несколько, то они могут следовать в произвольном порядке. Значение переменной исходно установлено в start или 0. На каждой последующей итерации оно увеличивается на step или 1. Выражение upto или below позволяет ограничить количество итераций: upto остановит итерации, когда значение переменной будет больше end, below – когда больше или равно. Если синонимы from и to используются совместно или же from используется без to, то from будет интерпретирован как upfrom.

Справочник по языку

–  –  –

{collect | append | nconc} expression [into var] Собирает список (исходно nil) в процессе итерации. Если первое ключевое слово – collect, то значения выражения expression собираются в список; если append, то возвращаемые из expression значения объединяются в список с помощью append; если nconc, то делается то же самое деструктивно. Если предоставляется переменная var, то ей будет присвоен полученный список, но в этом случае он не будет возвращаться как результат loop-вызова по умолчанию.

Внутри loop предложения collect, append и nconc могут аккумулировать значения в одну и ту же переменную. Если для нескольких предложений не заданы отдельные переменные var, это будет расценено как намерение собирать все значения в один список.

{count | sum | maximize | minimize} expression [into var] [type] Аккумулирует число в процессе итерации. Если используется ключевое слово count, возвращаемое значение будет отражать количество истинных результатов вычисления выражения expression; если sum, то будет возвращена сумма всех полученных значений; если maximize/minimize, то максимальное/минимальное значение из всех полученных. Для count и sum исходным значением будет 0, для maximize и minimize исходное значение не определено. Если задана var, она будет связана с полученным значением, и оно не будет возвращаться как значение loop-выражения по умолчанию.

Также может быть задан тип type аккумулируемого значения.

Внутри loop предложения sum и count могут аккумулировать значения в одну и ту же переменную. Если для нескольких предложений не заданы отдельные переменные var, это будет расценено как намерение аккумулировать все значения в одно. Аналогично для maximize и minimize.

when test then-clause1 {and then-clause}* [else else-clause1 {and else-cause}*] [end] Вычисляет выражение test. Если оно истинно, по порядку вычисляются выражения then-clause, в противном случае – else-clause.

Выражения then-clause и else-clause могут использовать do, return, when, unless, collect, append, nconc, count, sum, maximize и minimize.

Выражение в then-clause1 или else-clause1 может использовать it, в этом случае оно будет ссылаться на значение выражения test.

unless test then-clause1 {and then-clause}* [else else-clause1 {and else-clause}*] [end] Предложение вида unless test e1…en эквивалентно when (not test) e1…en.

repeat integer Добавляет тест на завершение: итерации прекращаются после выполнения integer итераций.

Справочник по языку

–  –  –

(declare (optimize property*)) Декларация учитывается в процессе компиляции самой обобщенной функции, то есть кода, отвечающего за диспетчеризацию. Не влияет на компиляцию самих методов. См. declare.

(:documentation string) Задает документацию к имени fname с ключом function.

(:method-combination symbol arguments*) Определяет тип комбинации методов, используемый для имени symbol. Встроенные типы комбинации не требуют каких-либо аргументов, собственные типы комбинации могут быть определены с помощью развернутой формы define-method-combination.

(:generic-function-class symbol) Определяет принадлежность обобщенной функции к классу symbol. Может использоваться для изменения класса существующей обобщенной функции. По умолчанию используется standard-generic-function.

(:method-class symbol) Указывает, что все методы обобщенной функции должны принадлежать классу symbol. Могут переопределяться классы существующих методов. По умолчанию используется standard-method.

(:method qualifier* parameters. body) Эквивалент (defmethod fname qualifier* parameters. body). entry может включать более одного выражения такого типа.

макрос (define-method-combination symbol property*) Сокращенная форма: определяет новый тип комбинации методов.

Краткая форма используется для прямой операторной комбинации методов. Если c1…cn – список вызовов применимых методов (от более специфичного к менее специфичному) для комбинации методов с оператором symbol, то вызов обобщенной функции будет эквивалентен (symbol c1…cn).

property может быть следующим:

:documentation string Задает строку документации для symbol с ключом method-combination.

:identity-with-one-argument bool Делает возможной оптимизацию вызовов обобщенной функции, для которой существует только один применимый метод. Если bool истинен, значения, возвращаемые методом, возвращаются как значения обобщенной функции. Используется, например, в and- и progn-комбинации методов.

Справочник по языку

–  –  –

:order order Если значение order равно :most-specific-first (по умолчанию), методы аккумулируются по убыванию специфичности; если используется :most-specific-last, то в обратном порядке.

:required bool Если значение bool истинно, то в случае отсутствия аккумулированных методов будет возвращаться ошибка.

макрос (defmethod fname qualifier* parameters. body) Определяет метод обобщенной функции fname; если она не существует, то будет создана. Возвращает новый метод. Вызывает ошибку, если fname является именем обычной функции или макроса.

Квалификаторы qualifier – это атомы, используемые при комбинации методов. Стандартная комбинация методов допускает квалификаторы :before, :after или :around.

Параметры parameter подобны аналогичным в обычных функциях, за исключением того, что обязательные параметры могут быть представлены списками вида (name specialization), где specialization – класс или имя класса (первый вариант) либо список вида (eql expression) (второй вариант). В первом случае соответствующий аргумент должен принадлежать указанному классу. Второй вариант указывает, что параметр в момент раскрытия выражения defmethod должен быть равен (eql) expression. Методы определяются уникальным образом по квалификаторам и специализации, и если два метода идентичны, то новый заменит старый. Список parameters должен быть конгруэнтен параметрам других методов данной обобщенной функции, а также самой обобщенной функции.

Применение метода эквивалентно вызову (lambda parms. body) с аргументами обобщенной функции, где parms – это parameters без специализации. Как и для defun, тело неявно заключается в блок с именем fname, если fname – символ, или f, если fname – список вида (setf f).

функция (ensure-generic-function fname &key argument-precedence-order declare documentation environment generic-function-class lambda-list method-class method-combination) Делает fname (который не может быть именем обычной функции или макроса) именем обобщенной функции с заданными свойствами. Если обобщенная функция с таким именем уже существует, ее свойства заменяются при выполнении следующих условий. Свойства argument-precedence-order, declare, documentation и method-combination перезаписываются всегда; lambda-list должен быть конгруэнтен Справочник по языку

–  –  –

(:print-object [fname]) Действует подобно :print-function, но вызывается лишь с двумя аргументами. Может использоваться что-то одно: либо :print-function, либо :print-object.

(:type {vector | (vector type) | list}) Указывает способ реализации структуры в виде объекта заданного типа. Отдельные структуры в таком случае будут списками или векторами; никакой новый тип не будет определен для структуры, и никакой предикат для идентификации структур (если только не задано :named) не будет добавлен. Если заданный тип :type – (vector type), то :named может использоваться, только если type является надтипом symbol.

Каждое поле field может быть одиночным символом name или (name [initform property*]).

Имя одного поля не должно совпадать с именем другого, включая локальные и наследуемые через :include. Имя поля будет использоваться при создании функции доступа к этому полю; по умолчанию для структуры str будет определяться функция str-name, но это поведение можно настроить с помощью :conc-name. Имя name также становится параметром по ключу в функции создания структур str, значение которого будет помещено в соответствующее поле новой структуры.

Исходное значение initform, если задано, вычисляется каждый раз при создании новой структуры в том окружении, где произошел вызов defstruct. Если исходное значение initform не задано, значение поля на момент создания не определено.

property может быть одним из:

:type type Декларирует, что данное поле будет содержать объекты только типа type.

:read-only1 bool Если bool не является nil, поле будет «только для чтения».

–  –  –

знаками перед десятичным разделителем, d (по умолчанию столько, сколько потребуется) знаками после него и e (по умолчанию столько, сколько потребуется) знаками в экспоненте. Если задан m, он заменит знак экспоненты.

~w, d, e, s, x, p, mG Если следующий аргумент является рациональной дробью, он будет отображен с помощью ~F или ~E в зависимости от числа.

~d, n, w, p$ Используется для печати денежных сумм. Если следующий аргумент является рациональной дробью, он будет напечатан в десятичном представлении с, по меньшей мере, n (по умолчанию – 1) цифрами перед десятичным разделителем и d цифрами (по умолчанию – 2) после него. Будет напечатано, по меньшей мере, w (по умолчанию – 0) знаков; если потребуется, то число будет смещено влево на p (по умолчанию – #\Space). С модификатором @ знак будет напечатан даже перед положительными числами. С модификатором : знак будет напечатан перед смещением.

Подобным образом действует pprint-newline с аргументами, зависящими от модификаторов: отсутствие соответствует :linear, @ соответствует :miser, : соответствует :fill, а :@ соответствует :mandatory.

~prefix~;body~;suffix~:

Действует подобно pprint-logial-block, требуя, чтобы следующий аргумент был списком. prefix и suffix аналогичны :prefix (или :per-line-prefix, если за ним следует ~@;) и :suffix, а body играет роль выражений, составляющих тело. body может быть любой форматирующей строкой, а аргументы для нее получаются из списка аргументов, как при использовании pprint-pop. Внутри тела ~^ соответствует pprint-exit-if-list-exhausted. Если из трех параметров prefix, body и suffix заданы лишь два, то значением suffix по умолчанию считается ""; если задан лишь один из трех, то prefix также считается "". С модификатором : prefix и suffix имеют значения по умолчанию "(" и ")" соответственно. С модификатором @ список оставшихся аргументов становится аргументом логического блока. Если вся директива заканчивается ~:@, то новая условная строка :fill добавляется после каждой группы пробелов в body.

~nI Эквивалент (pprint-indent :block n). С модификатором : аналогично (pprint-indent :current n).

~/name/ Вызывает функцию с именем name и, по меньшей мере, четырьмя аргументами: поток; следующий аргумент; два значения, истинных, когда используется : или @ соответственно, а также любыми другими параметрами, переданными директиве.

Печать

–  –  –

Спецификаторы типов Спецификаторы типов могут быть простыми или составными. Простой спецификатор – это символ, соответствующий имени типа (например, integer). Составной спецификатор – это список из символа и набора аргументов. В этом разделе будут рассмотрены варианты составных спецификаторов.

(and type*) Соответствует пересечению типов type.

(array type dimensions) (simple-array type dimensions) Соответствуют множеству массивов с типом type и размерностями, соответствующими dimensions. Если dimensions – неотрицательное целое число, оно указывает на количество размерностей; если это список, то он указывает на величину каждой размерности (как в вызове make-array). Использование simple-array ограничивает множество простыми массивами. Знак *, встречающийся на месте типа type или одной из размерностей dimensions, означает отсутствие соответствующих ограничений.

(base-string i) (simple-base-string i) Эквиваленты (vector base-character i) и (simple-array base-character (i)) соответственно.

(bit-vector i) (simple-bit-vector i) Эквиваленты (array bit (i)) и (simple-array bit (i)) соответственно.

(complex type) Соответствует множеству комплексных чисел, мнимые и действительные части которых принадлежат типу type.

(cons type1 type2) Соответствует множеству ячеек, car которых принадлежит типу type1, а cdr – типу type2. Знак * в одной из позиций соответствует t.

(eql object) Соответствует множеству из одного элемента: object.

Спецификаторы типов (float min max) (short-float min max) (single-float min max) (double-float min max) (long-float min max) Указывают на множество чисел с плавающей запятой определенного типа со значениями между min и max, где min и max – либо f (включая число f), либо (f) (исключая число f), где f – число соответствующего типа либо *, что указывает на отсутствие ограничения.

(function parameters type) Используется только в декларациях. Соответствует множеству функций, чьи аргументы принадлежат типам, указанным parameters, и возвращающих значение(я) типа type. Список parameters соответствует списку спецификаторов типов для аргументов функции (аргументы по ключу сообщаются как список вида (key type)). Спецификатор, следующий за &rest, соответствует типу последующих аргументов, а не типу самого аргумента, который всегда является списком. (Также обратите внимание на спецификатор типа values.) (integer min max) Аналог float для целых чисел.

(member object*) Соответствует множеству объектов object.

(mod i) Соответствует множеству целых чисел, меньших i.

(not type) Соответствует дополнению до множества type.

(or type*) Соответствует объединению типов type.

(rational min max) Аналог float для рациональных чисел.

(real min max) Аналог float для действительных чисел.

(satisfies symbol) Соответствует множеству объектов, удовлетворяющих функции с одним аргументом и именем symbol.

(signed-byte i) Соответствует множеству целых чисел между –2(i–1) и 2(i–1)–1 включительно. Эквивалент integer, если i является *.

418 Глава D. Справочник по языку (string i) (simple-string i) Соответствуют множеству строк и простых строк длиной i соответственно.

(unsigned-byte i) Соответствует множеству неотрицательных целых чисел, меньших 2i. Эквивалент (integer 0 *), если i – *.

(values. parameters) Используется только в спецификаторах function и выражениях the.

Соответствует множеству наборов значений, которые могут передаваться в multiple-value-call с функцией типа (function parameters).

(vector type i) (simple-vector i) Эквиваленты (array type (i)) и (simple-array t (i)) соответственно.

Необходимо помнить, что простой вектор – это не только простой одномерный массив. Простой вектор может также хранить объекты любых типов.

Макросы чтения Макросами, состоящими из одного знака, являются (, ), ’, ; и ‘. Все предопределенные управляемые макросы чтения имеют управляющий знак #.

–  –  –

Обратную кавычку легко понять, если рассмотреть значения, возвращаемые выражением, в котором она используется.° Чтобы вычислить такое выражение, удалим обратную кавычку и все соответствующие ей запятые, заменяя выражение после каждой кавычки на соответствующее ему значение. Вычисление выражения, начинающегося с запятой (вне обратной кавычки) приводит к ошибке.

Запятая соответствует обратной кавычке, когда между ними имеется одинаковое количество запятых и обратных кавычек (b находится между a и c, если a предшествует выражению, содержащему b, и b предшествует выражению, содержащему c). Это означает, что в корректном (well-formed) выражении последняя обратная кавычка совпадает с наиболее глубоколежащей запятой.

Предположим, что x вычисляется в a, которая вычисляется в 1; и y вычисляется в b, которая вычисляется в 2. Чтобы вычислить выражение:

‘‘(w,x,,y) удалим первую обратную кавычку и вычислим все, что следует за соответствующими ей запятыми. Ей соответствует лишь крайняя справа запятая. Если мы удалим ее и заменим оставшееся выражение его значением, то получим:

‘(w,x,b) 420 Глава D. Справочник по языку

–  –  –

Этот раздел может считаться библиографией. Все книги и статьи, перечисленные в нем, рекомендуются к прочтению.

14 Steele, Guy L., Jr., with Scott E. Fahlman, Richard P. Gabriel, David A. Moon, Daniel L. Weinreb, Daniel G. Bobrow, Linda G. DeMichiel, Sonya E. Keene, Gregor Kiczales, Crispin Perdue, Kent M. Pitman, Richard C. Waters, and Jon L White.

«Common Lisp: the Language», 2nd Edition. Digital Press, Bedford (MA), 1990.

19 McCarthy, John. «Recursive Functions of Symbolic Expressions and their Computation by Machine, Part I». CACM, 3:4 (April 1960), pp. 184–195.

McCarthy, John. «History of Lisp». In Wexelblat, Richard L. (Ed.) «History of Programming Languages». Academic Press, New York, 1981, pp. 173–197.

Эти книги доступны по адресу http://www-formal.stanford.edu/jmc/.

21 Brooks, Frederick P. «The Mythical Man-Month»1. Addison-Wesley, Reading (MA), 1975, p. 16.

Быстрое прототипирование – это не просто способ написания качественных программ в краткие сроки. Это способ написания программ, которые без него не будут написаны вовсе.

Даже очень амбициозные люди начинают с небольших дел. Проще всего сначала заняться несложной (или, по крайней мере, кажущейся несложной) за дачей, которую вы в состоянии сделать в одиночку. Вот почему многие большие дела происходили из ма лых начинаний. Быстрое прототипирование дает возможность начать с ма лого.

22 Там же, p. i.

23 Murray, Peter and Linda. «The Art of the Renaissance». Thames and Hudson, London, 1963, p. 85.

23 Janson, W J. «History of Art», 3rd Edition. Abrams, New York, 1986, p. 374.

Ана логия применима, разумеется, только к станковой живописи и позднее к живописи по холсту. Настенная живопись по-прежнему выполнялась в виде фресок. Я также не берусь утверждать, что стили живописи полностью следова ли за технологическим прогрессом, наоборот, противоположное мнение кажется более отвечающим действительности.

30 Имена car и cdr происходят из внутреннего представления списков в первой реа лизации Лиспа: car соответствовал «Contents of Address part of Register», Фредерик Брукс «Мифический человеко-месяц, или как создаются про

–  –  –

то есть содержимому адресной части регистра, а cdr – «Contents of the Decrement part of the Register», то есть декрементной части регистра.

34 Читатели, столкнувшиеся с серьезными затруднениями в понимании рекурсии, могут обратиться к одной из следующих книг:

Touretzky, David S. «Common Lisp: A Gentle Introduction to Symbolic Computation». Benjamin/Cummings, Redwood City (CA), 1990, Chapter 8.

Friedman, Daniel P., and Matthias Felleisen. «The Little Lisper». MIT Press, Cambridge, 1987.

43 В ANSI Common Lisp имеется также макрос lambda, позволяющий писать (lambda (x) x) вместо #’(lambda (x) x). Поскольку он скрывает симметрию между лямбда-выражениями и символьными именами функций (для которых необходимо использовать #’), его использование привносит довольно сомнительную элегантность.

44 Gabriel, Richard P. «Lisp: Good News, Bad News, How to Win Big». AI Expert, June 1991, p. 34.

62 Следует остерегаться еще одного момента при использовании sort: она не гарантирует сохранение порядка следования элементов, равных с точки зрения функции сравнения. Например, при сортировке (2 1 1.0) с помощью корректная реа лизация Common Lisp может вернуть как (1 1.0 2), так и (1.0 1 2). Чтобы сохранить исходный порядок для одинаковых с точки зрения функции сравнения элементов, используйте более медленную функцию stable-sort (также деструктивную), которая возвращает только первое значение.

76 Много было сказано о пользе комментариев и практически ничего – о затратах на них. Но комментарии имеют свою цену. Хороший код, как хорошая проза, требует постоянного пересмотра. Для этого код должен быть компактным и податливым. Межстрочные комментарии делают код менее гибким и более расплывчатым, задерживая тем самым его развитие.

77 Несмотря на то, что подавляющее число реа лизаций используют набор знаков ASCII, Common Lisp гарантирует лишь следующее их упорядочение: 26 знаков нижнего регистра, расположенных по возрастанию в алфавитном порядке, их ана логи в верхнем регистре, а также цифры от 0 до 9.

90 Стандартный способ реализации очередей с приоритетом – использование структуры, называемой кучей. См. Sedgewick, Robert. «Algorithms». AddisonWesley, Reading (MA), 1988.

95 Определение progn похоже на правило вычисления вызовов функций в Common

Lisp (стр. 27). Хотя progn и является специальным оператором, мы можем определить похожую функцию:

(defun our-progn (&rest args) (car (last args))) Она будет совершенно неэффективна, но функционально эквива лентна реальному progn, если последний аргумент возвращает только одно значение.

98 Ана логия с лямбда-выражениями нарушается, если именами переменных являются символы, имеющие в списке параметров особое значение. Например, выражение:

(let ((&key 1) (&optional 2))) Комментарии корректно, а вот соответствующее ему лямбда-выражение – уже нет:

((lambda (&key &optional)) 1 2) При построении ана логии между do и labels возникает такая же проблема. Выражаю благодарность Дэвиду Кужнику (David Kuzhnik) за указание на нее.

102 Steele, Guy L., Jr., and Richard P. Gabriel. «The Evolution of Lisp». ACM SIGPLAN Notices 28:3 (March 1993). Пример, процитированный в этом отрывке, перенесен в Common Lisp из Scheme.

104 Чтобы сделать вывод времени более читаемым, необходимо убедиться, что минуты и секунды представляются в виде пары цифр:

(defun get-time-string () (multiple-value-bind (s m h) (get-decoded-time) (format nil "~A:~2,,,’O@A:~2,,,’O@A" h m s))) 107 В своем письме от 18 марта (по старому стилю) 1751 года Честерфилд писал:

«Хорошо известно, что Юлианский ка лендарь неточен, так как переоценивает продолжительность года на одинна дцать дней. Папа Григорий Трина дцатый исправил эту ошибку [в 1582]; его ка лендарная реформа немедленно была принята в Католической Европе, а затем и протестантами, но не была принята в России, Швеции и Англии. На мой взгляд, отрицание грубой общеизвестной ошибки не делает Англии особой чести, особенно в такой компании. Вытекающие из этого факта неудобства испытыва ли, например, те, кто имел дело с иностранной корреспонденцией, политической или финансовой. По этой причине я предпринял попытку реформирования: проконсультировался с лучшими юристами и опытнейшими астрономами, и мы подготовили законопроект по этому вопросу. Но здесь нача лись первые трудности: я должен был использовать юридический язык и астрономические вычисления, но в этих вопросах я дилетант. Тем не менее было совершенно необходимо, чтобы в Па лате Лордов меня сочли разбирающимся в этих вопросах и чтобы они сами не чувствова ли себя профанами. Со своей стороны, я уже изъяснялся с ними на Кельтском и Славонском на темы, связанные с астрономией, и они вполне поняли меня. Поэтому я решил, что лучше заниматься делом, а не разглагольствовать и угождать, вместо того чтобы информировать. Я лишь дал им небольшой экскурс в историю ка лендарей, от Египетского к Грегорианскому, развлекая их занимательными историческими эпизодами. При этом я был крайне осмотрителен в выборе слов и применил свое ораторское искусство, чтобы представить гармоничность и завершенность интересующего меня случая. Это сработа ло, и сработа ло бы всегда. Я усладил их слух и донес нужную информацию, после чего многие из них сообщили, что проблема теперь совершенно ясна. Но, видит Бог, я даже не пытался ничего доказывать.»

См. Roberts, David (Ed.) «Lord Chesterfield’s Letters». Oxford University Press, Oxford, 1992.

108 В Common Lisp универсальным временем считается целое число, представляющее количество секунд, прошедших с нача ла 1900 года. Функции encodeuniversal-time и decode-universal-time осуществляют перевод дат между форматами. Таким образом, для дат после 1900 года в Common Lisp есть более простой способ выполнения этого преобразования:

424 Комментарии

–  –  –

(defun date+ (d m y n) (num-date (+ (date-num d m y) (* 60 60 24 n)))) Помимо вышеупомянутого ограничения имеется предел, за которым представления дат не будут принадлежать типу fixnum.

112 Хотя вызов setf может пониматься как обращение к ссылке на конкретное место, он реа лизует более обобщенный механизм. Пусть, например, marble – это структура с одним полем color:

(defstruct marble color) Следующая функция принимает список разновидностей мрамора (marble) и возвращает их цвет, если он один для всех экземпляров, и nil – в противном случае:

(defun uniform-color (lst) (let ((c (marble-color (car lst)))) (dolist (m (cdr lst)) (unless (eql (marble-color m) c) (return nil))) c)) Хотя uniform-color не ссылается на конкретное место, возможно и разумно вызывать setf с этой функцией в качестве первого аргумента. Определив (defun (setf uniform-color) (val lst) (dolist (m lst) (setf (marble-color m) val))) мы сможем сказать (setf (uniform-color *marbles*) ’red) чтобы сделать каждый элемент в *marbles* красным.

112 В ранних реа лизациях Common Lisp приходилось использовать defsetf для определения раскрытия setf-выражения. При определении порядка следования аргументов необходимо проявлять аккуратность и помнить, что новое значение располагается последним в определении функции, передаваемой вторым аргументом defsetf. Таким образом, вызов:

(defun (setf primo) (val lst) (setf (car lst) val)) эквива лентен (defsetf primo set-primo) (defun set-primo (lst val) (setf (car lst) val)) Комментарии 118 Язык С, например, позволяет передавать указатель на функцию, но при этом список того, что вы можете передать функции, существенно меньше (т. к.

в С нет замыканий), как и список действий, которые может совершить с этой функцией получатель (т. к. в С нет ана лога apply). Кроме того, вы обязаны декларировать для нее тип возвращаемого значения. Сможете ли вы написать в С ана лог map-int или filter? Разумеется, нет. Вам придется подавлять проверку типов аргументов и возвращаемого значения, а это опасно и, вероятно, возможно лишь для 32-битных значений.

120 За разнообразными примерами всестороннего использования замыканий обращайтесь к книге Abelson, Harold, and Gerald Jay Sussman, with Julie Sussman.

«Structure and Interpretation of Computer Programs».1 MIT Press, Cambridge, 1985.

120 За дополнительной информацией о языке Dylan обращайтесь к книге Shalit, Andrew, with Kim Barrett, David Moon, Orca Starbuck, and Steve Strassmann.

«Dylan Interim Reference Manual». Apple Computer, 1994. Этот документ доступен2 на нескольких ресурсах, в том числе http://www.harlequin.com и http:// www.apple.com.

Scheme – это очень маленький и чистый диалект Лиспа. Он был придуман Гаем Стилом и Джеральдом Сассманом в 1975 году и на момент написания книги был определен в книге Clinger, William, and Jonathan A. Rees (Eds.) «Revised Report on the Algorithmic Language Scheme»3. 1991.

Этот отчет, а также разнообразные реа лизации Scheme на момент печати были доступны через анонимный FTP: swiss-ftp.ai.mit.edu:pub.

Можно отметить две замечательные книги по языку Scheme: «Structure and Interpretation of Computer Programs» («Структура и интерпретация компьютерных программ»), указанная ранее, и Springer, George and Daniel P. Friedman «Scheme and the Art of Programming». MIT Press, Cambridge, 1989.

123 Наиболее неприятные баги в Лиспе могут быть связаны с динамическим диапазоном. Подобные вещи практически никогда не возникнут в Common Lisp, который по умолчанию использует лексический диапазон. Многие диа лекты Лиспа, используемые, как правило, как встраиваемые языки, работают с динамическим диапазоном, и об этом необходимо помнить.

Один подобный баг напоминает проблему захвата переменных (стр. 176). Представьте, что вы передаете одну функцию как аргумент другой, и эта функция получает некоторую переменную в качестве аргумента. Однако внутри функЭта книга очень полезна. В Интернете имеется русский перевод (под названием «Структура и интерпретация компьютерных программ»; книга также известна как SICP), решения большинства за дач из книги, а также соответствующие видеолекции MIT с русскими субтитрами. – Прим. перев.

На момент подготовки перевода ни один из этих ресурсов, похоже, не содержал упомянутого материа ла. Документация и прочая актуальная информация о языке Dylan доступна по адресу http://www.opendylan.org. – Прим.

перев.

На момент подготовки перевода актуальной являлась шестая версия специ

–  –  –

ции, которая ее вызывает, данная переменная не определена или имеет другое значение.

Предположим, к примеру, что мы написа ли ограниченную версию mapcar:

(defun our-mapcar (fn x) (if (null x) nil (cons (funcall fn (car x)) (our-mapcar fn (cdr x)))))

Пусть эта функция используется в другой, add-to-all, которая принимает число и добавляет его к каждому элементу списка:

(defun add-to-all (lst x) (our-mapcar #’(lambda (num) (+ num x)) lst)) В Common Lisp этот код будет работать без проблем, но в Лиспе, использующем динамический диапазон, мы получили бы ошибку. Функция, передаваемая как аргумент our-mapcar, ссылается на x. В момент передачи этой функции в ourmapcar переменная x должна быть числом, переданным в качестве второго аргумента add-to-all. Но внутри вызова функции our-mapcar переменная x будет иметь иное значение, а именно список, передаваемый как второй аргумент ourmapcar. Когда этот список будет передан вторым аргументом +, будет вызвана ошибка.

134 Более новые реализации Common Lisp содержат переменную *read-eval*, которая может отключать макрос чтения #.. При вызове read-from-string с пользовательским вводом будет разумно связать *read-eval* с nil. В противном случае пользователь может получить побочные эффекты, если будет использовать #.

во вводе.

136 Существует множество оригинальных алгоритмов быстрого поиска совпадений в строках, но применительно к поиску в текстовых файлах наш метод грубой силы оказывается вполне быстрым. За другими алгоритмами поиска совпадений в строках обращайтесь к книге Sedgewick, Robert «Algorithms».

Addison-Wesley, Reading (MA), 1988.

151 В 1984 году Common Lisp определял reduce без параметра по ключу :key, поэтому

random-next нужно было бы определить следующим образом:

(defun random-next (prev) (let* ((choices (gethash prev *words*)) (i (random (let ((x 0)) (dolist (c choices) (incf x (cdr c))) x)))) (dolist (pair choices) (if (minusp (decf i (cdr pair))) (return (car pair)))))) 151 Программа, подобная Henley, использова лась в 1989 году для симуляции новостных лент в интернет-рассылках авторства известных флеймеров. Значительное количество читателей приняло подобные сообщения за правду. Как и за всеми хорошими розыгрышами, за этим стояла определенная идея. Что можно Комментарии сказать о содержании реальных флеймов или о внимании, с которым их читают, если случайно сгенерированный текст мог быть принят за реальное сообщение?

Серьезным вкла дом в развитие искусственного интеллекта можно считать умение разделять задачи по сложности. Некоторые за дачи оказываются вполне тривиальными, другие – почти неразрешимыми. Поскольку работы, связанные с искусственным интеллектом, посвящены в первую очередь последним, изучение первых можно было бы назвать искусственной глупостью (artificial stupidity). Возможно, глупое имя, но у этой области есть большие перспективы – она может дать нам программы, подобные Henley, которые будут выполнять роль контрольных задач для проверки каких-либо гипотез.

Оказывается, что иногда слова вовсе не обязаны передавать какие-либо мысли, и этому способствует склонность людей усиленно искать смысл там, где его нет.

Поэтому если оратор позаботится о привнесении ма лейшего смысла в свою речь, доверчивая публика несомненно сочтет их глубокомысленными.

Пожалуй, это явление ничуть не моложе самого человечества. Однако новые технологии позволяют шагнуть еще дальше, и примером этого может служить наша программа генерации случайного текста. Она предельно проста, но может заставить людей искренне считать свою «поэзию» делом рук человеческих (можете проверить на своих друзьях). Более сложные программы, несомненно, смогут генерировать более осмысленные тексты.1 Интересное обсуждение случайной генерации стихов как полноценной литературной формы вы можете найти здесь: Low, Jackson M. Poetry, Chance, Silence, Etc. In Hall, Donald (Ed.) «Claims for Poetry». University of Michigan Press, Ann Arbor, 1982.

Стараниями Online Book Initiative текстовые версии многих классических работ, включая эту, доступны в сети. На момент издания оригина ла2 они были доступны по анонимному FTP: ftp.std.com:obi.

Также вам может показаться интересным режим Dissociated Press в Emacs.

161 Следующая функция отображает значения 16 констант, определяющих ограничения на размер чисел с плавающей запятой в используемой реа лизации:

(defun float-limits () (dolist (m ’(most least)) (dolist (s ’(positive negative))

Описанная идея породила нема ло других шуток, в том числе в России. Мноstrong>

гие из них играют на псевдонаучности получаемого текста. Например, сервис Яндекс. Рефераты предлагает генерацию рефератов на заданные темы.

Сканда лом обернулся также эксперимент М. Гельфанда, в котором псевдонаучная статья под названием «Корчеватель: алгоритм типичной унификации точек доступа и избыточности», сгенерированная программой SCIgen (написанной в MIT) и переложенная на русский язык с помощью отечественной разработки «Этап-3», была допущена к печати в одном из журна лов ВАК (в 2008 г). Подобная шутка была позже организована в одном из американских журна лов. – Прим. перев.

Похоже, этот документ, как и сама организация OBI, канул в лету. – Прим.

перев.

428 Комментарии (dolist (f ’(short single double long)) (let ((n (intern (string-upcase (format nil "~A-~A-~A-float" m s f))))) (format t "~30A ~A~%" n (symbol-value n))))))) 174 Алгоритм quicksort был предложен Хоаром в 1962 году и описан в книге Дональда Кнута «Sorting and Searching». Addison-Wesley, Reading (MA), 1973.

182 Foderaro, John K. «Introduction to the Special Lisp Section». CACM 34:9 (September 1991), p. 27.

185 За детальной информацией об использовании CLOS обращайтесь к книгам:

Keene, Sonya E. «Object Oriented Programming in Common Lisp». AddisonWesley, Reading (MA), 1989.

Kiczales, Gregor, Jim des Rivieres, and Daniel G. Bobrow. «The Art of the Metaobject Protocol». MIT Press, Cambridge, 1991.

187 Давайте скажем на другой лад: мы можем выполнить модификации такого рода даже без просмотра остального кода. Эти слова могут прозвучать тревожно для некоторых читателей. В них заключается рецепт спагетти-кода.

Объектно-ориентированная модель позволяет упростить построение программ с помощью их расширения. Такая возможность в неумелых руках может привести к спагетти-коду. Это не всегда плохо, но ничего хорошего в таком явлении тоже нет.

Приличная часть когда-либо написанного кода является именно спагетти-кодом, и положение дел вряд ли поменяется в скором времени. Для программ, которые в любом случае закончат как спагетти, объектно-ориентированная модель, несомненно, полезна: они хотя бы будут структурированными спагетти. Но для программ, которые жела ли бы избежать подобной участи, использование объектной ориентированности может быть скорее опасным, чем полезным.

192 При наследовании экземпляром слота с одинаковым именем от нескольких суперклассов наследуемый слот содержит суперпозицию свойств всех родительских слотов. Механизм комбинации может различаться для разных свойств:

1. Свойства :allocation, :initform (если имеется) и :documentation (если имеется) будут получены из наиболее специфичного класса.

2. Свойства :initarg будут объединением параметров :initarg всех суперклассов. Это справедливо также для свойств :accessor, :reader и :writer.

3. Свойство :type будет пересечением параметров :type всех суперклассов.

199 Вы можете избежать необходимости уда лять символы вручную, изначально используя неинтернированные символы:

(progn (defclass counter () ((#1=#:state :initform 0)))

–  –  –

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

Если для вас это неудобно, можете воспользоваться следующим макросом чтения:

(defvar *symtab* (make-hash-table :test #’equal))

–  –  –

224 Некоторые примеры использования disassemble на различных процессорах вы сможете найти в книге Norvig, Peter «Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp». Morgan Kaufmann, San Mateo (CA), 1992.

225 Популярность объектно-ориентированного программирования часто связывают с популярностью C++, которая возникла благодаря усовершенствованиям в плане типизации. Концептуально C++ связан с С, но в числе прочего позволяет создавать операторы, работающие с аргументами разных типов. Однако для этого вовсе не обязательно использовать объектно-ориентированный язык – достаточно динамической типизации. Если вы понаблюдаете за людьми, пишущими на C++, то обнаружите, что создаваемые ими иерархии классов обычно являются плоскими. C++ стал популярным не потому, что позволяет работать с классами и методами, а потому что людям необходимо обходить некоторые ограничения типизации в С.

226 Создание деклараций значительно упрощается с помощью макросов. Следующий макрос получает имя типа и выражение (вероятно, численное) и генерирует раскрытие, в котором за декларирован за данный тип для всех промежуточных результатов. Чтобы гарантировать вычисление выражения e с помощью только fixnum-арифметики, достаточно сказать (with-type fixnum e).

(defmacro with-type (type expr) ‘(the,type,(if (atom expr) expr (expand-call type (binarize expr)))))

–  –  –

Если вам предстоит много работать с fixnum-арифметикой, возможно, стоит определить макрос чтения, раскрывающийся в вызов (with-type fixnum...).

231 На многих Unix-системах пригодным файлом со словами является /usr/dict/ words.

233 T является диа лектом Scheme с множеством полезных дополнений, включая поддержку пулов. Больше информации по этой теме вы можете найти в книге Rees, Jonathan A., Norman I. Adams, and James R.Meehan. «The T Manual», 5th Edition. Yale University Computer Science Department, New Haven, 1988.

На момент публикации оригина ла1 руководство по T, а также его реа лизация были доступны по анонимному FTP: hing.lcs.mit.edu:pub/t3.1.

237 Различия между спецификациями и программами можно считать количественными, но не качественными. Однажды поняв это, становится неестественным требовать, чтобы кто-либо составлял документацию до нача ла реа лизации проекта. Если программа пишется на низкоуровневом языке, то будет полезно предварительно описать за дачу в терминах высокого уровня. Но при переходе к высокоуровневым языкам необходимость в подобных действиях исчезает. В некотором роде реа лизация и промежуточная спецификация становятся одним и тем же.

Если программа, ранее написанная на низкоуровневом языке, переписывается на более абстрактном языке, ее реализация начинает напоминать спецификацию даже в большей степени, чем использовавшаяся ранее спецификация. Перефразируя основную мысль раздела 13.7, можно сказать: спецификация программы на С может быть написана на Лиспе.

237 История отливки скульптуры «Персей» Бенвенутто Челлини, вероятно, наиболее известная (и наиболее курьезная), по сравнению с другими литыми бронзовыми скульптурами. Cellini, Benvenuto. «Autobiography». Перевод George Bull, Penguin Books, Harmondsworth, 1956.

246 Даже опытные Лисп-программисты иногда находят работу с пакетами неудобной. Потому ли это, что они и правда сложны, или же мы просто не привыкли думать, что происходит в момент чтения?

Подобная концептуальная трудность также связана с defmacro. Большой объем работы был выполнен для поиска более абстрактной альтернативы defmacro.

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

Так что, возможно, пакеты окажутся разумным способом реа лизации модульности. Даже при беглом взгляде очевидно, что они сильно напоминают методиНа момент подготовки перевода этот ресурс не был доступен. Данный доку

–  –  –

ки, используемые программистами при отсутствии формальной модульной системы.1 248 Можно утверждать, что макрос loop является более общим и что не стоит определять множество операторов, чтобы добиться того, что можно получить и с одним. Но loop является одним оператором только с формальной точки зрения.

В этом смысле eval также является одним оператором. Но с точки зрения концептуальной сложности для пользователя loop содержит, по меньшей мере, столько же операторов, сколько и различных типов предложений. К тому же эти предложения не могут использоваться отдельно как полноценные операторы в Лиспе: невозможно взять часть loop-выражения и передать его как аргумент какой-то функции, как это можно сделать с map-int, например.

254 Больше информации по теме логического вывода можно найти в книге Russell, Stuart, and Peter Norvig «Artificial Intelligence: A Modern Approach»2. Prentice Hall, Englewood Cliffs (NJ), 1995.

278 Программа в главе 17 использует возможность формы setf быть первым аргументом defun. Она отсутствова ла в ранних реа лизациях Common Lisp, поэтому для запуска приведенного кода на ранних реализациях потребуется небольшая модификация:

(proclaim ’(inline lookup set-lookup))

–  –  –

Это «пророчество» оказа лось верным, и на сегодняшний момент пакеты используются повсеместно и полноценно в Common Lisp-коде и признаются одной из важнейших особенностей языка. – Прим. перев.

Книга переведена на русский: Рассел С., Норвиг П. «Искусственный интеллект: современный подход», 2-е изд. – Пер. с англ. и ред. К. А. Птицына. – М.: Вильямс, 2006.

Книга (известная также как AIMA) представляет собой фундаментальный труд, посвященный проблемам ИИ. Она ценна тем, что дает систематизированное представление об ИИ и объединяет основные его концепции, но вряд ли может служить полноценным руководством по какой-либо отдельно взятой области ИИ. Вас также может заинтересовать код на Common Lisp, сопровождающий книгу. Он свободно доступен по адресу: http://aima.cs.berkeley.edu/lisp/. – Прим. перев.

Комментарии

–  –  –

В некоторый момент случайным образом образова лась особенная молекула.

Назовем ее Репликатором. Она не обязательно была самой большой или самой сложной среди себе подобных, но она облада ла особым свойством – умением копировать саму себя.

–  –  –

Для нача ла нам следует определить набор символьных выражений в терминах ориентированных пар и списков. Затем нужно определить пять элементарных функций и предикатов и построить на их основе условные выражения и рекурсивные определения более широкого набора функций (мы приведем ряд примеров с ними). Затем мы покажем, как сами эти функции могут быть выражены в символьном виде, а также определим универсальную функцию apply, позволяющую вычислять значение заданной функции с за данными аргументами.

–  –  –

#(, макрос чтения, 418 Символы #*, макрос чтения, 418 *, переменная, 415 #+, макрос чтения, 419 *, функция, 365 #, макрос чтения, 419 **, переменная, 415 #|, макрос чтения, 419 ***, переменная, 415 /, переменная, 416 Числа /, функция, 365 1–, функция, 365 //, переменная, 416 1+, функция, 365 ///, переменная, 416 +, переменная, 415 A +, функция, 365 ++, переменная, 415 abort, функция, 346 +++, переменная, 415 abs, функция, 356

–, переменная, 416 acons, функция, 367

–, функция, 365 acosh, функция, 356 /=, функция, 364 acos, функция, 356, функция, 365 add-method, обобщенная функция, 335 =, функция, 365 adjoin, функция, 368 =, функция, 364 adjustable-array-p, функция, 373, функция, 365 adjust-array, функция, 373 =, функция, 365 allocate-instance, обобщенная функция, #A, макрос чтения, 419 335 #B, макрос чтения, 418 alpha-char-p, функция, 365 #C, макрос чтения, 419 alphanumericp, функция, 365 #n#, макрос чтения, 419 and, макрос, 321 #n=, макрос чтения, 419 append, функция, 368 #O, макрос чтения, 418 apply, функция, 321 #P, макрос чтения, 419 apropos-list, функция, 406 #R, макрос чтения, 419 apropos, функция, 406 #S, макрос чтения, 419 aref, функция, 374 #X, макрос чтения, 418 arithmetic-error-operands, функция, 356 ;, макрос чтения, 418 arithmetic-error-operation, функция, 356 ‘, макрос чтения, 418 array-dimension, функция, 374 ‘, макрос чтения, 418 array-dimension-limit, константа, 409 (, макрос чтения, 418 array-dimensions, функция, 374 ), макрос чтения, 418 array-displacement, функция, 374 # макрос чтения, 418 array-element-type, функция, 374 #, макрос чтения, 419 array-has-fill-pointer-p, функция, 374 #:, макрос чтения, 418 array-in-bounds-p, функция, 375 #., макрос чтения, 418 arrayp, функция, 375 #’, макрос чтения, 418 array-rank-limit, константа, 409 Алфавитный указатель

–  –  –

defconstant, макрос, 322 ecase, макрос, 323 defgeneric, макрос, 337 echo-stream-input-stream, функция, 390 define-compiler-macro, макрос, 317 echo-stream-output-stream, функция, define-condition, макрос, 347 390 define-method-combination, макрос, 338, ed, функция, 407 339 elt, функция, 380 define-modify-macro, макрос, 322 Emacs, 21, 35 define-setf-expander, макрос, 322 encode-universal-time, функция, 407 define-symbol-macro, макрос, 318 endp, функция, 369 defmacro, макрос, 318 enough-namestring, функция, 386 defmethod, макрос, 340 ensure-directories-exist, функция, 389 defpackage, макрос, 352 ensure-generic-function, функция, 340 defparameter, макрос, 322 eq, функция, 323 Алфавитный указатель

–  –  –

*print-array*, переменная, 413 pprint-tabular, функция, 402 P1 *print-base*, переменная, 413 prin1, функция, 403 P1 *print-case*, переменная, 413 prin1-to-string, функция, 403 P1 *print-circle*, переменная, 413 princ, функция, 402 P1 *print-escape*, переменная, 413 princ-to-string, функция, 402 P1 *print-gensym*, переменная, 414 print, функция, 402 P1 *print-length*, переменная, 414 print-not-readable-object, функция, 402 P1 *print-level*, переменная, 414 print-object, обобщенная функция, 402 P1 *print-lines*, переменная, 414 print-unreadable-object, макрос, 403 P1 *print-miser-width*, переменная, 414 probe-file, функция, 389 P1 *print-pprint-dispatch*, переменная, 414 proclaim, функция, 319 P1 *print-pretty*, переменная, 414 prog*, макрос, 327 P1 *print-radix*, переменная, 414 prog, макрос, 327 P1 *print-readably*, переменная, 414 prog1, макрос, 327 P1 *print-right-margin*, переменная, 414 prog2, макрос, 327 P1 package-error-package, функция, 355 progn, специальный оператор, 327 package-name, функция, 355 progv, специальный оператор, 327 package-nicknames, функция, 355 provide, функция, 406 package-shadowing-symbols, функция, psetf, макрос, 328 355 psetq, макрос, 328 package-use-list, функция, 355 push, макрос, 371 package-used-by-list, функция, 355 pushnew, макрос, 371 Алфавитный указатель

–  –  –

Т тип, 44 атомарный, 239 встроенный, 44 иерархия, 44, 239 как множество, 239 конечный, 240 целочисленный, 154 типизация динамическая, 225 сильная, 224 точечная пара, 65 Ф функция глобальная, 111 деструктивная, 62, 70, 208 значение, 32 имя, 32 как агрегат, 34 как значение, 118 как процесс, 34 Издательство “СИМВОЛПЛЮС” Основано в 1995 году

Pages:     | 1 |   ...   | 2 | 3 ||

Похожие работы:

«МЕСТНОЕ САМОУПРАВЛЕНИЕ г. ТАГАНРОГ РОСТОВСКОЙ ОБЛАСТИ ГОРОДСКАЯ ДУМА ГОРОДА ТАГАНРОГА РЕШЕНИЕ № 407 29.03.2012 Об информации о деятельности по осуществлению местного самоуправления на территории г. Таганрога в 2...»

«ОГЛАВЛЕНИЕ Введение................................................ 5 Глава 1 Задачи обнаружения и различения сигналов в условиях неопределенности..........................»

«247 М. Ю. Крапивин. "Выпуск папирос с портретами наших вождей. "Выпуск папирос с портретами наших вождей является вульгаризацией их совершенно не нужной": руководство ГПУ о портретах руководителей партии и государства на табачной продукции (июль 1923 г.) Публикаци...»

«Регулятор отопления НСС 3 Погодозависимый регулятор отопления Инструкция по эксплуатации и монтажу Перед установкой и эксплуатацией внимательно ознакомиться с настоящей инструкцией Содержание Страница Страница A.1...»

«И.А. АЛЕБАСТРОВА * ТЕРРИТОРИАЛЬНОЕ ДЕЛЕНИЕ И ТЕРРИТОРИАЛЬНОЕ УСТРОЙСТВО ПУБЛИЧНОЙ ВЛАСТИ В ГОСУДАРСТВЕ: ОСНОВНЫЕ МОДЕЛИ 1 Ключевые слова: территория, государство, территория государства, фор ма государства, территориальная организация публ...»

«БОРЬБА ЗА ЭНЕРГОРЕСУРСЫ: ОТ ПРОТИВОСТОЯНИЯ К ПРОТИВОБОРСТВУ Валентин Литвин Когда много миллиардов лет назад произошл Великий Взрыв и образовалась наша планета, или после семи дней Творения, огромные запасы н...»

«ПОЖАЛУЙСТА, РАСПЕЧАТАЙТЕ СВОЙ БИЛЕТ И ВОЗЬМИТЕ С СОБОЙ ПАСПОРТ, ПРАВА И ПОЛИС ОМС Счет-оферта № _ от "_" 20_ г. Московская область Волоколамский район, Шелудьково 39 на оказание услуг по предоставлению Зака...»

«Пролетарии всех стран, соединяйтесь! ЛЕНИН ПОЛНОЕ СОБРАНИЕ СОЧИНЕНИЙ ПЕЧАТАЕТСЯ ПО ПОСТАНОВЛЕНИЮ ЦЕНТРАЛЬНОГО КОМИТЕТА КОММУНИСТИЧЕСКОЙ ПАРТИИ СОВЕТСКОГО СОЮЗА ИНСТИТУТ МАРКСИЗМА-ЛЕНИНИЗМА ПРИ ЦК КПСС В. И. ЛЕНИН ПОЛНОЕ СОБРАНИЕ СОЧИНЕНИЙ ИЗДАНИЕ ПЯТОЕ ИЗДАТЕЛЬСТВО ПОЛИТИЧЕСКОЙ...»

«Договор № г. Санкт-Петербург [ ] штамп с датой заключения договора (Наименование контрагента), именуемое в дальнейшем "ИСПОЛНИТЕЛЬ", в лице (должность, ФИО), действующего на основании (), с одной стороны, и...»

«Наталия Колесникова Лауреат Нобелевской премии В. С. Найпол: жизнь, творчество, судьба РОССИЙСКАЯ АК АДЕМ ИЯ НАУК ИНСТИТУТ ВОСТОКОВЕДЕНИЯ Наталия Колесникова Лауреат Нобелевской премии В. С. Найпол: жизнь, творчество, судьба Москва Институт востоковедения РАН УДК 929:012(821.111) ББК 83.3(4...»

«Государственное автономное образовательное учреждение СМК МГИИТ высшего образования города Москвы ММТ.1.28.08.2015 МОСКОВСКИЙ Г ОС У ДА Р СТ В Е Н НЫ Й И НС Т ИТ УТ И Н ДУ С Т Р И И Т У Р ИЗ М А ИМ Е Н И Ю.А. СЕНКЕВИЧА Лист1из 43 УТВЕРЖДАЮ Проректор по учебной и методической работе В.В. Гернеший "31" августа 2015 г. Р...»










 
2017 www.book.lib-i.ru - «Бесплатная электронная библиотека - электронные ресурсы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.