muwind 发表于 2021-11-30 23:45:55

向autoload学习

比较喜欢用autoload加载函数,但是最近公司有童鞋说我的插件无法使用,查了下是autoload函数木有
这个函数是在acadXXXdoc.lsp中定义的,但是他把这个文件弄丢了,函数原型如下
(defun _autoload (app)
(load app)
);这个函数也忒简单,不知道桌子公司在玩什么
(defun _autoqload (quoi app cmdliste / qapp symnam)
(setq qapp (strcat "\"" app "\""))
(setq initstring "\nInitializing...")
(mapcar
   '(lambda (cmd / nom_cmd)
      (progn
      (setq nom_cmd (strcat "C:" cmd))
      (if (not (eval (read nom_cmd)))
            (eval
             (read (strcat
                  "(defun " nom_cmd "( / rtn)"
                  "(setq m:err *error* *error* *merrmsg*)"
                  "(if (ai_ffile " qapp ")"
                  "(progn (princ initstring)"
                  "(_auto" quoi "load " qapp ") (setq rtn (" nom_cmd ")))"
                  "(ai_nofile " qapp "))"
                  "(setq *error* m:err m:err nil)"
                  "rtn)"
                  ))))))
   cmdliste)
nil
);这个函数对于学习mapcar evalread 等几个函数有些示范作用,

(defun autoload (app cmdliste)
(_autoqload "" app cmdliste)
) ;这是调用的autoload ,也很简单
从这个函数看出加载的一切根源其实load,其他都是做修饰。
个人用autoqload的主要目的就是文件不存在的时候 他不会干活(ai_ffile 函数判断)
最后我写了个自用的加载函数
(defun LoadApp( filename / )
(if (AppExist filename)
   (if (= (load filename "96245863364")"96245863364")
      (prompt (strcat "\n " filename "加载出错!"))
                filename
       )
       (prompt(strcat "\n " filename "不在支持路径' "))
   )
);也没什么先进的,就是增加了出错提示和文件判断AppExist 函数和ai_ffile 功能一样 可以用ai_ffile替代

单个文件可以这么加载多个文件,可以用foreach 或者mapar,又写了个函数
(defun Apps( AppName ParaLst/ )
(cond ((and (= (type ParaLst) 'STR) (wcmatch ParaLst"*;*"))
            (mapcar '(lambda ( n / ) (eval (read (strcat "(" AppName " n )" ) ))) (str2lst ParaLst ";" ) ))
          ((= (type ParaLst ) 'LIST)
            (mapcar '(lambda ( n / ) (eval (read (strcat "(" AppName " n )" ) ))) ParaLst ))
          (T nil)
)
);;单参数函数批量化运行,ParaLst可以是表也可以是分号分开的字符串

(defun LoadApps(files / )
(Apps "LoadApp"files )
)
不知道上面的函数有什么用,就当学习 mapcar evalread几个函数的简单使用吧


muwind 发表于 2022-2-25 22:42:38

autoload到底干了撒呢:
就是在用他的时候建立一系列的"c:命令名"函数,这个autoload 建立“c:命令名” 函数们 就是加载lsp文件,然后执行这个命令。后面必须跟列表啊,因为他要用mapcar 针对每一个list中的命令建立一个“c:命令名“的函数
举个例子: (autoload "test.lsp" '("a" "b" "c"))
他就建立了三个函数 “c:a““ c:b““ c:c“(这三个函数在test.lsp其实也是有的,不过这里建立的就很简单了 就几行代码,test.lsp里面的这三个函数代码就可能复杂很多 占用了大量的内存)。autoload建立的三个简化的函数,内容就是 加载test.lsp ,这时候test.lsp里面的三个“c:a““ c:b““ c:c“ 就会覆盖 autoload建立的三个“c:a““ c:b““ c:c“ 函数,这时候 运行命令就是test.lsp里面的三个函数。
原理就这样的,因此我们可以自己改装他 以满足需要,不嫌麻烦的可以自己简化命令

kozmosovia 发表于 2024-9-23 20:03:27

autoload是少内存时代的产物,按需加载,不用的话,就保持简单函数定义,占用内存最小。现代电脑大部分内存足够,没必要整按需加载,一次性全部加载即可。

jhzxj 发表于 2021-12-3 13:00:01

baitang36 发表于 2021-12-2 12:26
学习的人,扣2

2 2 2 2 2 2 2
很想学习,但不知从何开始

yanshengjiang 发表于 2021-12-1 22:14:29

学习的人不多了

yuyehuan 发表于 2021-12-2 11:08:30

学习的人,扣1

baitang36 发表于 2021-12-2 12:26:38

学习的人,扣2

lxdz443 发表于 2021-12-4 06:08:51

学习学习。

20060510412 发表于 2021-12-5 12:48:27

autoload我也一直在用,使用程序的时候才加载,完全不影响CAD启动速度。

20060510412 发表于 2022-3-8 10:30:54

加深了对eval函数的理解

zhangkui9070 发表于 2022-9-18 15:49:27

挺好的:handshake
页: [1] 2
查看完整版本: 向autoload学习