Возвращаемые значения, 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'у управление экраном и памятью, и тот продолжает дальше работать. Потери минимальны, а в результате программа не "вылетает" на ровном месте.