Выбрать главу

5. РАБОТА СО СПИСКАМИ

Все обрабатываемые данные Автолисп делит на две большие группы: атомы и списки. Под атомом понимается некоторая программная единица, рассматриваемая Автолиспом как единое целое. Список, по определению разработчиков [5], представляет собой группу связанных элементов, разделенных пробелами и заключенных в скобки. Он служит эффективным средством хранения связанных величин и может содержать данные любого типа. При необходимости идентификации элемента с атомом или списком можно воспользоваться одной из двух функций:

(atom элемент) возвращает nil, если элемент является списком, и T - в противном случае,

(listp элемент) возвращает Т., если элемент является списком, и nil - в противном случае. Примеры:

(setq а ‘(х у z))

(atom ‘а) возвращает T,

(atom а) возвращает nil,

(atom ‘(a b c)) возвращает nil,

(listp '(abc)) возвращает T,

(listp ‘а) возвращает nil,

(listp 4.38) возвращает Т.

5.1. Формирование списков

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

(list выражение ...).

Примеры списков:

(list a b с) возвращает (А В С),

(list a (b с) d) возвращает (А (В С) D),

(list 2.1 4.8) возвращает (2.1 4.8).

Если ни одно из выражений не содержит переменных или неопределенных элементов, функция list может быть заменена функцией quote. Для Автолиспа эквивалентны выражения

(list 2.1 4.8) и ‘(2.1 4.8).

(append список ...). Функция принимает любое количество списков и объединяет их в один.

(append ‘(a b) ‘(с d)) возвращает (А В С D),

(append ‘((a) (b)) ‘((с) (d))) возвращает ((A) (B) (C) (D)).

(cons новый_элемент список). Функция принимает новый элемент в качестве первого, добавляя его к уже существующему списку, и возвращает новый список.

(cons ‘a ‘(b с d)) возвращает (А В С D),

(cons ‘(a) ‘(b с d)) возвращает ((A) В С D).

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

(cons ‘а 2) возвращает (А . 2).

(reverse список). Функция обращает список, располагая его элементы в обратном порядке.

(reverse '((a) b c)) возвращает (С В (A)).

(subst новый_элемент старый_элемент список). Функция отыскивает в списке старый_элемент и возвращает копию списка, в которой старый_элемент заменен новым. Если старый_элемент в списке отсутствует, список возвращается без изменений.

(setq sample ‘(a b (с d) b))

(subst ‘qq ‘b sample) возвращает (A QQ (С D) QQ),

(subst ‘qq ‘(c d) sample) возвращает (A B QQ В),

(subst ‘qq ‘x sample) возвращает (A B (C D) B).

(length список) возвращает число элементов в списке.

(length ‘(a b с d)) возвращает 4,

(length ‘(a b (с d))) возвращает 3,

(length ‘()) возвращает 0.

(mapcar функция список1 ... списокN). Функция mapсаr просматривает списки, совершает над ними операции, предписанные функцией и возвращает результат.

(setq a 10 b 20 с 30)

(mapcar '1+(list a b c)) возвращает (11 21 31),

т.е., использование функции mapcar эквивалентно использованию последовательно трех выражений:

(1+a),

d+b),

(1+c).

5.2. Извлечение данных из списка

Двумя основными функциями, позволяющими извлечь из списка хранящиеся в нем данные, являются car и cdr.

(car список). Функция возвращает первый элемент списка. Если список пуст, возвращается nil.

(car ‘(a b c)) возвращает А,

(car ‘((a b) c)) возвращает (А В),

(car ‘()) возвращает nil.

(cdr список). Функция возвращает список, за исключением первого элемента. Если список пуст, возвращается nil.