Введение в Автолисп | страница 29
В качестве примера организации цикла рассмотрим программу сохранения системных переменных, которая часто используется в прикладных программах (например в файле 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 ...)).
После окончания всех операций, предусмотренных программой, восстановить системные переменные можно пользовательской функцией