Page 23 - AutoLISP и Visual LISP в среде AutoCAD
P. 23
2.8.2. ГЛОБАЛЬНЫЕ И ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ
Все переменные AutoLisp делятся на два вида: глобальные и локальные.
Глобальные переменные постоянно находятся в оперативной памяти и,
следовательно, доступны из любой функции. Глобальные переменные
создаются автоматически при присвоении им значения.
Локальные переменные явно описываются в заголовке функции defun и
видны только внутри соответствующей пользовательской функции. В начале
работы пользовательской функции локальные переменные имеют значение
nil. По окончании работы этой функции они автоматически удаляются из
памяти.
Аргументы пользовательских функций также являются локальными
переменными. В начале работы пользовательской функции аргументы
принимают значения, переданные функции при ее вызове.
Использование глобальных переменных крайне нежелательно. Они
занимают память; вызывают необходимость отслеживания имен переменных
(а локальных переменных с одинаковыми именами в разных
пользовательских функциях мажет быть сколько угодно). Данные следует
хранить в локальных переменных и передавать через параметры вызываемых
функций.
Если глобальные переменные все же используются, как только
необходимость в них отпадает, следует освобождать занимаемую ими
память, присваивая им значение nil.
Пользовательская функция может не иметь как локальных переменных,
так и аргументов. В любом случае пара скобок после имени функции
сохраняется.
Примеры:
(defun fun1 (a b / c d) ….)
(defun fun2 (a b) …..)
(defun fun3 (/ c d) …)
(defun fun4 ( ) ….)
Использование локальных параметров покажем на примере. Требуется
вычислить площадь треугольника, если известны длины всех его сторон.
Воспользуемся теоремой Герона:
S = p ( p - a )( p - b )( p - ) c ,
a + b + c
где p = .
2
Назовем функцию Geron. Ее аргументами будут стороны треугольника.
Переменная p служит лишь для временного хранения значения
полупериметра, поэтому будет локальной.
(defun Geron (a b c / p)
(setq p (/ (+ a b c) 2.0))
(sqrt (* p (- p a) (- p b) (- p c)))
) ; конец функции
22