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

(ssdel e1 ss1) возвращает SS1 (без элемента e1);

(ssdel e2 ss1) возвращает nil.

(sslength набор). Функция возвращает целое число, соответствующее количеству элементов в наборе.

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

(ssname набор индекс). Функция возвращает имя примитива, порядковый номер которого соответствует введенному индексу. Если индекс отрицателен или превышает число примитивов в наборе, возвращается nil. Следует помнить, что первому элементу набора присваивается индекс 0. Если необходимо извлечь имя примитива, индекс которого превышает 32767, следует вводить его как действительное число. Например,

(setq entx (ssname sset 50483.0))

возвращает имя 50484-го примитива набора, присваивая ему идентификатор entx.

6.6. Организация циклов при обработке наборов

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

(repeat число выражение ...). Функция выполняет операции, определяемые выражением заданное число раз и возвращает последний результат. Аргумент число обязателен, список выражений не должен быть пустым. Пример [2]:

(setq a 10 b 100)

(repeat 4

    (setq a (+ a 10))

    (setq b (+ b 100))

)

присваивает а значение 50, b - значение 500.

(while условие выражение ...). Функция оценивает условие, и если оно не nil, выполняет выражение. Процесс продолжается до тех пор, пока условие не примет значения nil. Функция возвращает значение последнего выражения.

В качестве примера организации цикла рассмотрим программу сохранения системных переменных, которая часто используется в прикладных программах (например в файле attredef.lsp; находящемся в папке support пакета AutoCAD).

(defun MODES (а)

    (setq MLST '())

    (repeat (length а)

        (setq MLST (append MLST

            (list (list (саг а) (getvar (car a))) )) )

        (setq a (cdr a))

    )

)

Каждая системная, переменная обладает именем и значением, т.е. представляет собой список из двух элементов. Первая строка программы описывает пользовательскую функцию MODES, включающую один аргумент, по содержанию имеющий определенное сходство с формальным параметром в подпрограмме Фортрана. Автолисп позволяет использовать параметр для подстановки как атомов, так и списков. В данном случае будет использован список системных переменных. Вторая строка создает пустой список MLST. Третья - открывает цикл, в котором количество повторов операции соответствует длине аргумента а, т.е. числу сохраняемых переменных. Далее в первом цикле выполняются следующие операции (для удобства чтения одна из подстрок выделена полужирным шрифтом):

(car а) - извлекается первая системная переменная из списка а сохраняемых переменных;

(getvar (car a)) - извлекается значение первой системной переменной;

(list (car a) (getvar (car а))) - формирует подсписок, состоящий из имени переменной и ее значения;

(list (list (car a) (getvar (car а))) ) - формирует список из подсписков переменных и их значений (в первом цикле список состоит из одного подсписка);

(append MLST (list (...))) - сформированный список присоединяется к пустому списку MLST;

(setq MLST (append MLST (list (...)))) - результат предыдущего действия идентифицируется со списком MLST, который теперь не пуст, а содержит имя системной переменной и ее значение;

(setq a (cdr a)) - из списка переменных исключается обработанная переменная.

Во втором цикле все операции повторяются, но присоединение второй переменной и ее значения происходит уже не к пустому списку, а к списку, хранящему имя и значение первой переменной.

Теперь достаточно из основной программы вызвать функцию MODES с перечисленными в качестве аргументов именами сохраняемых системных переменных, и все они вместе с их значениями будут сохранены в списке MLST:

(modes '(sysvar1 sysvar2 sysvar3 ...)).