Введение в Автолисп | страница 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 ...)).


После окончания всех операций, предусмотренных программой, восстановить системные переменные можно пользовательской функцией