Следующая группа функций — это функции, работающие со списками и точечными парами. Точечная пара — это двухэлементный список вида (а . b), в котором в качестве особого разделителя выступает точка (точка в такой записи отделяется пробелом как от первого, так и от второго элементов). Точечные пары используются для хранения в файлах системы AutoCAD данных о графических примитивах. Первый элемент точечной пары обычно является целым числом и называется DXF-кодом, а второй — данными этого кода. Основной способ получения точечных пар — функция cons.
Есть отличия в работе некоторых функций со списками и с точечными парами.
Функция list — это основная функция, позволяющая создать список:
(list (<элемент1> [<элемент2> ... [<элементN>] ... ] ] )
В качестве аргументов <элементы>, из которых образуется список, могут выступать любые объекты, которыми оперирует AutoLISP. Самый распространенный список — это список из двух или трех вещественных чисел, представляющий точку.
В качестве элементов списка могут выступать другие списки или точечные пары.
Примеры:
(list 12.12 0.34 5.88) — возвращает (12.12 0.34 5.88);
(list 1 "ad2" (list 0 1 2)) — возвращает (1 "ad2" (0 1 2)) (третьим элементом нового списка является список из чисел 0, 1 и 2).
Следующие функции выполняют основные операции со списками:
(acad_strlsort <список>) – сортирует список в алфавитном порядке
(append [<список1> [<список2> ... [<списокN>] ... ] ] ) — слияние списков в один;
(nth <номер> <список>) — извлечение из списка элемента по порядковому номеру (нумерация элементов списка выполняется слева направо и начинается с нуля);
(reverse <список>) — переворот списка;
(car <список>) — извлечение первого элемента списка или точечной пары;
(cdr <список>) — извлечение из списка подсписка путем удаления первого элемента, если аргумент <список> является простым списком (т. е. не точечной парой), или извлечение второго элемента, если <список> является точечной парой.
Примеры:
(acad_strlsort '("Пн" "Вт" "Ср" "Чт" "Пт" "Сб" "Bс"))— возвращает ("Вс" "Вт" "Пн" "Пт" "Сб" "Ср" "Чт").
(append '(14 16) '(12.12 0.34 5.88)) — возвращает (14 16 12.12 0.34 5.88);
(nth 0 '(12.12 0.34 5.88)) — возвращает 12.12;
(reverse '(12.12 0.34 5.88)) — возвращает (5.88 0.34 12.12);
(car '(12.12 0.34 5. 88)) — возвращает 12.12;
(car '(62 . 1)) — возвращает 62;
(cdr '(12.12 0.34 5.88)) — возвращает (0.34 5.88);
(cdr ' (62 . 1)) — возвращает 1.
От функций car и cdr путем их повторения в разных комбинациях от двух до четырех раз в языке AutoLISP образованы следующие функции (их двадцать восемь):
• (сааr <список>) —равносильно (car (car <список>));
• (cadr <список>) —равносильно (car (cdr <список>));
• (cdar <список>) —равносильно (cdr (car <список>));
• (cddr <список>) —равносильно (cdr (cdr <список>));
• (саааr <список>) — равносильно (car (car (car <список>)))
• (caadr <список>) — равносильно (car (car (cdr <список>)))
• (cadar <список>) — равносильно (car (cdr (car <список>)))
• (caddr <список>) — равносильно (car (cdr (cdr <список>)))
• (cdaar <список>) — равносильно (cdr (car (car <список>)))
• (cdadr <список>) —равносильно (cdr (car (cdr <список>)))
• (cddar <список>) — равносильно (cdr (cdr (car <список>)))
• (cdddr <список>) —равносильно (cdr (cdr (cdr <список>)))
• (caaaar <список>) —равносильно (car (car (car (car <список>))));
• (caaadr <список>) —равносильно (car (car (car (cdr <список>)))).
Аналогичным методом раскрываются оставшиеся функции (caadar, caaddr, cadaar, cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cdddar, cddadr, cddddr).
Функция cons добавляет к списку первый элемент или создает точечную пару:
(cons <аргумент1> <аргумент2>)
Если <аргумент2> является списком, то функция cons добавляет в него <аргумент1> в качестве нового первого элемента. Если <аргумент2> является атомом (т. е. не списком), то функция cons создает точечную пару типа (<аргумент1> . <аргумент2>).
Примеры:
(cons 67.4 '(10.3 12.9 -3.9)) — возвращает (67.4 10.3 12.9 -3.9);
(cons "Happy" '("New" "Year")) — возвращает ("Happy" "New" "Year");
(cons 2 4) — возвращает (2 . 4);
(cons 8 "0") — возвращает (8 . "0");
(cons 62 l) — возвращает (62 . l).
Функция member проверяет принадлежность элемента списку:
(member <элемент> <список>)
Если функция member обнаруживает <элемент> в аргументе <список>, то возвращает остаток списка, начиная с этого места; если <элемент> в аргументе <список> не обнаруживается, то функция возвращает nil.
Примеры:
(member 1 '(4 50 1 2)) — возвращает (1 2);
(member 4 '(4 50 1 2)) — возвращает (4 50 1 2);
(member 0 '(4 50 1 2)) — возвращает nil.
Функция assoc применяется к списку, в котором элементами являются списки или точечные пары, и выбирает из этих элементов тот, у которого первый элемент имеет заданное значение:
(assoc <код> <список>)
Если в аргументе <список> имеется несколько элементов, удовлетворяющих требуемому условию, то в качестве возвращаемого значения выбирается первый из них. Функция assoc — основной инструмент в операциях выборки из списка с характеристиками примитива AutoCAD того элемента, который содержит точечную пару с нужным DXF-кодом свойства (цвета, типа линии, веса и т. д.).
Примеры:
(assoc 8 '((8 . "Walls") (62 .4) (6 . "ACAD_IS005W100") ) ) — возвращает (8 . "walls");
(assoc 62 '((8 . "Walls") (62 .4) (6 . "ACAD IS005W100") ) ) — возвращает (62 . 4).
Следующие три функции (apply, mapcar, foreach) позволяют выполнять операции сразу над всеми элементами списка.
(apply '<функция> <список>) — применение функции, заданной аргументом <функция> поочередно ко всем элементам списка, заданного аргументом <список>.
Примеры:
(apply '* (list 2 3 5)) — равносильно (* 2 3 5), поэтому возвращает 30;
(apply 'max (list 2 3 5)) — возвращает 5.
Последний пример показывает, что функция apply удобна, когда какую-то операцию нужно выполнить над аргументами, количество которых заранее неизвестно. Поэтому следует сформировать список, к которому затем применить функцию apply с именем нужной функции в качестве первого аргумента. Следует обратить внимание на употребление перед аргументом апострофа.
(mapcar ' <функция> <список1> [<список2> ... [<списокN>] ... ]) — применение функции, заданной аргументом <функция> сначала к первым элементам каждого из списков (<список1>, , <списокN>), затем — ко вторым элементам и т. д.; результаты объединяются в новый список, который является возвращаемым значением.
Пример:
(mapcar '* '(2 3) '(l 5)) возвращает (2 15), т. к. первый элемент результирующего списка вычисляется как (* 2 l), а второй — как (* 3 5).
Функция foreach позволяет организовать циклическое выполнение выражений (их может быть несколько), поочередно подставляя вместо переменной цикла элементы списка:
(foreach <имя> <список> [<выражение1> [<выражение2>... [ <выражениеN> ] ... ] ] )
Функция возвращает значение последнего вычисленного выражения. Если аргументы <выражение1> ... <выражениеN> не заданы, то функция foreach возвращает nil.
Пример:
(setq s1 0 s2 l)
(foreach p '(1 2 3 4 5) (setq s1 (+ s1 p) ) (setq s2 (* s2 p) ) ) — возвращает 120 (результат вычисления s2 — произведения чисел списка); кроме того, в переменной s1 сформируется сумма чисел списка.
Функция eval позволяет сформировать список и затем вычислить его (evaluate) как выражение. В таком списке на первом месте должно стоять имя функции.
Пример:
(setq mylist (list 'max 1.7 9.34 6.7));
(eval mylist) — возвращает 9.34 (вычисляется выражение (max l.7 9.34 6.7)).
Функция quote является обратной по отношению к функции eval и позволяет обрабатывать выражение как список, т. е. не вычисляя его. Сокращенным вариантом имени функции quote является одинарная кавычка.
Примеры:
(quote 6 7 8 2 l) — возвращает (67821);
'(16 23 90) — возвращает (16 23 90).
Есть отличия в работе некоторых функций со списками и с точечными парами.
Функция list — это основная функция, позволяющая создать список:
(list (<элемент1> [<элемент2> ... [<элементN>] ... ] ] )
В качестве аргументов <элементы>, из которых образуется список, могут выступать любые объекты, которыми оперирует AutoLISP. Самый распространенный список — это список из двух или трех вещественных чисел, представляющий точку.
В качестве элементов списка могут выступать другие списки или точечные пары.
Примеры:
(list 12.12 0.34 5.88) — возвращает (12.12 0.34 5.88);
(list 1 "ad2" (list 0 1 2)) — возвращает (1 "ad2" (0 1 2)) (третьим элементом нового списка является список из чисел 0, 1 и 2).
Следующие функции выполняют основные операции со списками:
(acad_strlsort <список>) – сортирует список в алфавитном порядке
(append [<список1> [<список2> ... [<списокN>] ... ] ] ) — слияние списков в один;
(nth <номер> <список>) — извлечение из списка элемента по порядковому номеру (нумерация элементов списка выполняется слева направо и начинается с нуля);
(reverse <список>) — переворот списка;
(car <список>) — извлечение первого элемента списка или точечной пары;
(cdr <список>) — извлечение из списка подсписка путем удаления первого элемента, если аргумент <список> является простым списком (т. е. не точечной парой), или извлечение второго элемента, если <список> является точечной парой.
Примеры:
(acad_strlsort '("Пн" "Вт" "Ср" "Чт" "Пт" "Сб" "Bс"))— возвращает ("Вс" "Вт" "Пн" "Пт" "Сб" "Ср" "Чт").
(append '(14 16) '(12.12 0.34 5.88)) — возвращает (14 16 12.12 0.34 5.88);
(nth 0 '(12.12 0.34 5.88)) — возвращает 12.12;
(reverse '(12.12 0.34 5.88)) — возвращает (5.88 0.34 12.12);
(car '(12.12 0.34 5. 88)) — возвращает 12.12;
(car '(62 . 1)) — возвращает 62;
(cdr '(12.12 0.34 5.88)) — возвращает (0.34 5.88);
(cdr ' (62 . 1)) — возвращает 1.
От функций car и cdr путем их повторения в разных комбинациях от двух до четырех раз в языке AutoLISP образованы следующие функции (их двадцать восемь):
• (сааr <список>) —равносильно (car (car <список>));
• (cadr <список>) —равносильно (car (cdr <список>));
• (cdar <список>) —равносильно (cdr (car <список>));
• (cddr <список>) —равносильно (cdr (cdr <список>));
• (саааr <список>) — равносильно (car (car (car <список>)))
• (caadr <список>) — равносильно (car (car (cdr <список>)))
• (cadar <список>) — равносильно (car (cdr (car <список>)))
• (caddr <список>) — равносильно (car (cdr (cdr <список>)))
• (cdaar <список>) — равносильно (cdr (car (car <список>)))
• (cdadr <список>) —равносильно (cdr (car (cdr <список>)))
• (cddar <список>) — равносильно (cdr (cdr (car <список>)))
• (cdddr <список>) —равносильно (cdr (cdr (cdr <список>)))
• (caaaar <список>) —равносильно (car (car (car (car <список>))));
• (caaadr <список>) —равносильно (car (car (car (cdr <список>)))).
Аналогичным методом раскрываются оставшиеся функции (caadar, caaddr, cadaar, cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cdddar, cddadr, cddddr).
Функция cons добавляет к списку первый элемент или создает точечную пару:
(cons <аргумент1> <аргумент2>)
Если <аргумент2> является списком, то функция cons добавляет в него <аргумент1> в качестве нового первого элемента. Если <аргумент2> является атомом (т. е. не списком), то функция cons создает точечную пару типа (<аргумент1> . <аргумент2>).
Примеры:
(cons 67.4 '(10.3 12.9 -3.9)) — возвращает (67.4 10.3 12.9 -3.9);
(cons "Happy" '("New" "Year")) — возвращает ("Happy" "New" "Year");
(cons 2 4) — возвращает (2 . 4);
(cons 8 "0") — возвращает (8 . "0");
(cons 62 l) — возвращает (62 . l).
Функция member проверяет принадлежность элемента списку:
(member <элемент> <список>)
Если функция member обнаруживает <элемент> в аргументе <список>, то возвращает остаток списка, начиная с этого места; если <элемент> в аргументе <список> не обнаруживается, то функция возвращает nil.
Примеры:
(member 1 '(4 50 1 2)) — возвращает (1 2);
(member 4 '(4 50 1 2)) — возвращает (4 50 1 2);
(member 0 '(4 50 1 2)) — возвращает nil.
Функция assoc применяется к списку, в котором элементами являются списки или точечные пары, и выбирает из этих элементов тот, у которого первый элемент имеет заданное значение:
(assoc <код> <список>)
Если в аргументе <список> имеется несколько элементов, удовлетворяющих требуемому условию, то в качестве возвращаемого значения выбирается первый из них. Функция assoc — основной инструмент в операциях выборки из списка с характеристиками примитива AutoCAD того элемента, который содержит точечную пару с нужным DXF-кодом свойства (цвета, типа линии, веса и т. д.).
Примеры:
(assoc 8 '((8 . "Walls") (62 .4) (6 . "ACAD_IS005W100") ) ) — возвращает (8 . "walls");
(assoc 62 '((8 . "Walls") (62 .4) (6 . "ACAD IS005W100") ) ) — возвращает (62 . 4).
Следующие три функции (apply, mapcar, foreach) позволяют выполнять операции сразу над всеми элементами списка.
(apply '<функция> <список>) — применение функции, заданной аргументом <функция> поочередно ко всем элементам списка, заданного аргументом <список>.
Примеры:
(apply '* (list 2 3 5)) — равносильно (* 2 3 5), поэтому возвращает 30;
(apply 'max (list 2 3 5)) — возвращает 5.
Последний пример показывает, что функция apply удобна, когда какую-то операцию нужно выполнить над аргументами, количество которых заранее неизвестно. Поэтому следует сформировать список, к которому затем применить функцию apply с именем нужной функции в качестве первого аргумента. Следует обратить внимание на употребление перед аргументом апострофа.
(mapcar ' <функция> <список1> [<список2> ... [<списокN>] ... ]) — применение функции, заданной аргументом <функция> сначала к первым элементам каждого из списков (<список1>, , <списокN>), затем — ко вторым элементам и т. д.; результаты объединяются в новый список, который является возвращаемым значением.
Пример:
(mapcar '* '(2 3) '(l 5)) возвращает (2 15), т. к. первый элемент результирующего списка вычисляется как (* 2 l), а второй — как (* 3 5).
Функция foreach позволяет организовать циклическое выполнение выражений (их может быть несколько), поочередно подставляя вместо переменной цикла элементы списка:
(foreach <имя> <список> [<выражение1> [<выражение2>... [ <выражениеN> ] ... ] ] )
Функция возвращает значение последнего вычисленного выражения. Если аргументы <выражение1> ... <выражениеN> не заданы, то функция foreach возвращает nil.
Пример:
(setq s1 0 s2 l)
(foreach p '(1 2 3 4 5) (setq s1 (+ s1 p) ) (setq s2 (* s2 p) ) ) — возвращает 120 (результат вычисления s2 — произведения чисел списка); кроме того, в переменной s1 сформируется сумма чисел списка.
Функция eval позволяет сформировать список и затем вычислить его (evaluate) как выражение. В таком списке на первом месте должно стоять имя функции.
Пример:
(setq mylist (list 'max 1.7 9.34 6.7));
(eval mylist) — возвращает 9.34 (вычисляется выражение (max l.7 9.34 6.7)).
Функция quote является обратной по отношению к функции eval и позволяет обрабатывать выражение как список, т. е. не вычисляя его. Сокращенным вариантом имени функции quote является одинарная кавычка.
Примеры:
(quote 6 7 8 2 l) — возвращает (67821);
'(16 23 90) — возвращает (16 23 90).