Как погасить сообщения nanoCAD при загрузке lsp?
В чате по nanoCAD возник вопрос (цитирую не дословно):
При загрузке любого лиспа нана автоматом выводит прописанные там команды.
Независимо от..
Учитывая что это ложится в автозагрузку, имха подавлять принудительно вывод ком строки плохая идея.. Можно не успеть вернуть как было
Вызов принят Погнали )))
Ну ок, первым делом пишу "типа загрузчик":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | ;; loader.lsp, болтается внутри path ((lambda (/ fun_browsefiles-in-directory-nested path sysvars) ;| Поиск всех файлов внутри каталога @Param path Полный путь к родительскому каталогу @Param mask Маска файла для выбора @Returns Список файлов из родительского каталога и всех его подкаталогов, отвечающих маске |; (defun fun_browsefiles-in-directory-nested (path mask) ;; call sample : (fun_browsefiles-in-directory-nested (getenv "appdata") "*.lsp") (apply (function append) (cons (if (vl-directory-files path mask) (mapcar (function (lambda (x) (strcat (vl-string-right-trim "\\" path) "\\" x))) (vl-directory-files path mask) ) ) (mapcar (function (lambda (x) (fun_browsefiles-in-directory-nested (strcat (vl-string-right-trim "\\" path) "\\" x) mask) ) ) (vl-remove ".." (vl-remove "." (vl-directory-files path nil -1))) ) ) ) ) (setq path "c:\\files" sysvars (vl-remove nil (mapcar (function (lambda (x / temp) (if (setq temp (getvar (car x))) (progn (setvar (car x) (cdr x)) (cons (car x) temp) ) ) ) ) '(("cmdecho" . 0) ("menuecho" . 0) ("nomutt" . 1) ) ) ) ) (foreach file (vl-remove-if (function (lambda (x) (= (strcase (vl-filename-base x)) "LOADER") ) ) (fun_browsefiles-in-directory-nested path "*.lsp") ) (vl-catch-all-error-p (vl-catch-all-apply (function (lambda () (load file (strcat "\nCan't load file " file)) ) ) ) ) ) (foreach item sysvars (setvar (car item) (cdr item)) ) (princ) ) ) |
И внутрь каталога c:\files помещаю лисп для примера:
1 2 3 4 | (defun c:test1 () (alert "Test1") (princ) ) |
Загружаю loader.lsp и...
1 2 3 | Команда: appload APPLOAD,ЗАГПРИЛ - Загрузка приложения... loader.lsp загружен. Команды: TEST1 |
Ну ок. А если слегка поменять определение test1?
1 2 3 4 5 6 7 8 | ((lambda () (defun c:test1 () (alert "Test1") (princ) ) (princ) ) ) |
Снова загрузка loader:
1 2 3 | Команда: appload APPLOAD,ЗАГПРИЛ - Загрузка приложения... |
Тээкс, а если убрать работу с системными переменными из загрузчика?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | ;; loader.lsp, болтается внутри path ((lambda (/ fun_browsefiles-in-directory-nested path) ;| Поиск всех файлов внутри каталога @Param path Полный путь к родительскому каталогу @Param mask Маска файла для выбора @Returns Список файлов из родительского каталога и всех его подкаталогов, отвечающих маске |; (defun fun_browsefiles-in-directory-nested (path mask) ;; call sample : (fun_browsefiles-in-directory-nested (getenv "appdata") "*.lsp") (apply (function append) (cons (if (vl-directory-files path mask) (mapcar (function (lambda (x) (strcat (vl-string-right-trim "\\" path) "\\" x))) (vl-directory-files path mask) ) ) (mapcar (function (lambda (x) (fun_browsefiles-in-directory-nested (strcat (vl-string-right-trim "\\" path) "\\" x) mask) ) ) (vl-remove ".." (vl-remove "." (vl-directory-files path nil -1))) ) ) ) ) (setq path "c:\\files") (foreach file (vl-remove-if (function (lambda (x) (= (strcase (vl-filename-base x)) "LOADER") ) ) (fun_browsefiles-in-directory-nested path "*.lsp") ) (vl-catch-all-error-p (vl-catch-all-apply (function (lambda () (load file (strcat "\nCan't load file " file)) ) ) ) ) ) (princ) ) ) |
Кха, а результат-то тот же!
1 2 3 | Команда: appload APPLOAD,ЗАГПРИЛ - Загрузка приложения... |
Т.е. для наника, если охота "погасить" вывод в ком.строку про загрузку приложения и определения команд, достаточно эти определения тупо обрамлять лямбдами и тихим выходом в конце. Жжесть )))
Если файл с функцией test1 из примера выше загрузить с использованием лисповского выражения
(load "c:\\files\\test1.lsp"), а не команды appload, возвращено будет только значение последнего выражения в файле.
Если последнее выражение, как в примере, - (princ), которое ничего не возвращает в командную строку, то загрузка произойдет визуально в "тихом" режиме.
Естественно, предварительно необходимо убедиться в наличии файла, а также быть уверенным, что в нем нет ошибок.
Т.е., загрузчик может представлять нечто типа
2
3
4
5
6
7
(load "file1")
(load "file2")
; (load "file3") ;временно не грузим
(princ "Пакет \"Поехали\" загружен!!!")
(princ)
)
Понятно, что реализация может включать загрузку файлов по списку, по результатам сканирования каталога и т.п..
Важно загружать лисповским выражением (load ...), которое фактически и берет на себя функцию подавления эха в командной строке.
Лисповская load не глушит вывод в ком.строку, насколько мне известно. У меня всего один вопрос - что будет выводиться в ком.строку, если в file1.lsp определено 2 команды, а в file2.lsp - еще три штуки? Ну вот прямо так, через defn c:< ...>
Я без наездов если что