Опубликован: 21.02.2012 | Уровень: специалист | Доступ: свободно
Лекция 3:

AutoLISP в среде Visual LISP

Функции, работающие со строками

К функциям, работающим со строками, относятся следующие:

  • (chr <целое>) - получает буквенно-цифровой символ (строку из одного буквенно-цифрового символа) по коду действующей таблицы символов;
  • (ascii <строка>) - получает код первого символа строки текста по действующей таблице символов;
  • (read <строка>) - читает строку-аргумент до первого пробела (или до конца, если пробелов нет) и возвращает прочитанное значение как символ AutoLISP (т. е. имя функции или переменной);
  • (strcase <строка> [<признак>]) - преобразует строку в верхний или нижний регистр (если аргумент <признак> опущен или равен nil, то функция strcase выполняет преобразование всех буквенно-цифровых символов строки в верхний регистр; если аргумент <признак> задан, и его значение отлично от nil, то выполняется преобразование строки в нижний регистр);
  • (strcat [<строка1> [<строка2> ... [<строкаN>] ... ]]) - конкатенация (сцепление)строк;
  • (strlen [<строка1> [<строка2> ... [<строкаN>] ... ]]) - вычисляет суммарную длину всех строк-аргументов (длина строки - это количество буквенно-цифровых знаков в строке);
  • (substr <строка> <начало> [<количество>]) - выделяет подстроку, начиная с заданной позиции; если количество аргументом <количество> не задано или задано больше, чем осталось в строке, определяемой аргументом <строка>, начиная с позиции, определяемой аргументом <начало>, то возвращается полный остаток строки от заданного места.

Примеры:

(chr 192) - возвращает "А" (русская буква); 
(chr 48) - возвращает "0"; 
(ascii "A") - возвращает 192 (русская буква); 
(ascii "A") - возвращает 65 (латинская буква); 
(ascii "ABCDEFGH") - возвращает 65 (все буквенно-цифровые знаки, кроме первого, игнорируются); 
(read "B C D E F") - возвращает B; 
(read "23.55") - возвращает 23.55; 
(read "10 масса") - возвращает 10; 
(strcase "AbcdE FGh-38") - возвращает "ABCDE FGH-38"; 
(strcase "AbcdE FGh-38" Т) - возвращает "abcde fgh-38"; 
(strcat "Happy N" "ew " "Year") - возвращает "Happy New Year"; 
(strcat (itoa 12) "-я линия") - возвращает "12-я линия"; 
(strlen "Happy N" "ew " "Year") - возвращает 14; 
(strlen "Петербург") - возвращает 9; 
(substr "Happy New Year" 7 3) - возвращает "New"; 
(substr "Happy New Year" 7) - возвращает "New Year".

Функция wcmatch проверяет строку на соответствие образцу (шаблону):

(wcmatch <строка> <образец>) 

Аргументы: <строка> - строка, структуру которой нужно проверить; <образец> - особая строка, определяющая требования к проверяемой структуре. Аргумент <образец> может содержать как обычные алфавитно-цифровые знаки, так и специальные групповые знаки (wild-card-characters), рассматриваемые в табл. 3.2.. Можно в строке, определенной аргументом <образец>, задать сразу несколько шаблонов, на соответствие каждому из которых аргумент <строка> будет проверен; шаблоны должны разделяться с помощью запятой.

Таблица 3.2. Специальные знаки, которые можно использовать в образце
Знак Назначение
# Заменяет одну любую цифру
@ Заменяет одну букву
. (точка) Заменяет любой символ, не являющийся ни буквой, ни цифрой
* Заменяет любую последовательность любых символов, даже пустую; может использоваться в любом месте аргумента <образец>
? Заменяет ровно один любой символ
Если стоит в начале образца, заданного аргументом <образец>, то означает "все, кроме определенного аргументом <образец>"
[...] Заменяет любой из символов, перечисленных в скобках
[∼. . .] Заменяет любой символ, кроме перечисленных в скобках
- Между двумя однотипными знаками указывает на диапазон
, (запятая) Разделяет два шаблона
' (обратный апостроф) Превращает специальный знак в обычный

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

Возвращаемое значение: т - если аргумент <строка> соответствует аргументу <образец>, nil - если не соответствует.

Примеры:

(wcmatch "Happy New Year" "H*") - возвращает T, т. к. проверяемая строка начинается с буквы "Н"; 
(wcmatch "Happy New Year" "h*") - возвращает nil (при проверке внутри строк символы "Н" и "h" считаются разными); 
(wcmatch "Happy New Year" "??ppy*, *New*, * * *") - возвращает Т, т. к. все три шаблона соблюдены; 
(wcmatch "Happy New Year" "*#*") - возвращает nil, т. к. нет ни одной цифры; 
(wcmatch "Happy New Year" "H[adgt]*") - возвращает Т; 
(wcmatch "Happy***day" "Happy'*'*'**") - возвращает Т; 
(wcmatch "Year 2000" "@ea@ [1-6]000") - возвращает Т.

Функции, работающие со списками и точечными парами

Следующая группа функций - это функции, работающие со списками и точечными парами. Точечная пара - это двухэлементный список вида (а . 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).

Следующие функции выполняют основные операции со списками:

  • (append [<список1> [<список2> ... [<списокN>] ... ] ] ) - слияние списков в один;
  • (nth <номер> <список>) - извлечение из списка элемента по порядковому номеру (нумерация элементов списка выполняется слева направо и начинается с нуля);
  • (reverse <список>) - переворот списка;
  • (car <список>) - извлечение первого элемента списка или точечной пары;
  • (cdr <список>) - извлечение из списка подсписка путем удаления первого элемента, если аргумент <список> является простым списком (т. е. не точечной парой), или извлечение второго элемента, если <список> является точечной парой.

Примеры:

(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 1)) - возвращает (67821); 
'(16 23 90) - возвращает (16 23 90).

Функция acad_strlsort позволяет отсортировать по возрастанию список, элементами которого являются строки.

Пример:

(acad_strlsort '("Пн" "Вт" "Ср" "Чт" "Пт" "Сб" "Bс"))- возвращает ("Вс" "Вт" "Пн" "Пт" "Сб" "Ср" "Чт").
Алексей Тимонин
Алексей Тимонин
Что возвращает функция chr() в таком примере (chr (- 65 1))?
Алексей Потапкин
Алексей Потапкин
как передать параметры в макрос