Возвращаемые значения, nil и “тихий” выход из функции

Недавно задали вопрос - "а есть ли в lisp процедуры, как в VBA?" Пришлось дать короткий ответ, но человек явно был неудовлетворен :) В результате появился этот текст.

Как известно, в AutoLISP все - функции. Функции всегда возвращают какое-то значение (даже если оно пустое, или nil). Функция возвращает результат выполнения последней своей строки. Рассмотрим несколько примеров:

1
2
3
4
5
(defun testfun( / a)
  (setq a 1)
  ;; ...
  (setq a 5)
  ) ;_ end of defun

Выполним эту функцию: (testfun). В результате в консоли VLIDE будет выведено 5 - результат выполнения последней строки (setq a 5). Изменим код:

1
2
3
4
5
(defun testfun( / a)
  (setq a 1)
  ;; ...
  (setq a "qwert")
  ) ;_ end of defun

Вызов testfun вернет уже строку "qwert" - опять результат выполнения последней строки.

Попробуем из функции сделать команду, заменив (defun testfun( ... на (defun c:tt( ...:

1
2
3
4
5
(defun c:tt( / a)
  (setq a 1)
  ;; ...
  (setq a "qwert")
  ) ;_ end of defun

И вызовем ее из комадной строки AutoCAD:

1
2
3
4
Command: TT
"qwert"

Command:

Как видим, результат выведен в командную строку. А если надо, чтобы команда (или функция, неважно) ничего не выводила в качестве результата? Т.е. мало того, чтобы возвращала nil, так еще и ничего не показывала?

Для этого достаточно перед самой последней скобкой определения функции или команды поставить (princ): вывод пустой строки:

1
2
3
4
5
6
(defun c:tt (/ a)
  (setq a 1)
  ;; ...
  (setq a "qwert")
  (princ)
  ) ;_ end of defun

Вызовем эту команду из AutoCAD:

1
2
3
Command: TT

Command:

Вуаля, команда отработала, но пользователь ничего не увидит :) Иногда подобные штуки способны избавить программиста от ответов на вопросы "а что там у меня в командной строке чего-то мелькает?"

P.S. Есть еще один момент, из-за которого иногда просто приходится применять (princ): это длительные вычисления. Наличие прогресс-бара из ExpressTools не всегда достаточно, иногда AutoCAD'у просто необходимо сообщить, что он еще работает. Наскоько я понимаю, вызов (princ) на краткий миг возвращает AutoCAD'у управление экраном и памятью, и тот продолжает дальше работать. Потери минимальны, а в результате программа не "вылетает" на ровном месте.



Поделитесь своим мнением


Я не робот.