明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2575|回复: 12

[函数] 向autoload学习

  [复制链接]
发表于 2021-11-30 23:45:55 | 显示全部楼层 |阅读模式
比较喜欢用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 eval  read 等几个函数有些示范作用,

(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 eval  read几个函数的简单使用吧


评分

参与人数 3明经币 +3 收起 理由
VBALISPER + 1
yanshengjiang + 1
Bao_lai + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 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里面的三个函数。
原理就这样的,因此我们可以自己改装他 以满足需要,不嫌麻烦的可以自己简化命令
发表于 2024-9-23 20:03:27 | 显示全部楼层
autoload是少内存时代的产物,按需加载,不用的话,就保持简单函数定义,占用内存最小。现代电脑大部分内存足够,没必要整按需加载,一次性全部加载即可。
发表于 2021-12-3 13:00:01 | 显示全部楼层

2 2 2 2 2 2 2
很想学习,但不知从何开始
发表于 2021-12-1 22:14:29 | 显示全部楼层
学习的人不多了
发表于 2021-12-2 11:08:30 | 显示全部楼层
学习的人,扣1
发表于 2021-12-2 12:26:38 | 显示全部楼层
学习的人,扣2
发表于 2021-12-5 12:48:27 | 显示全部楼层
autoload我也一直在用,使用程序的时候才加载,完全不影响CAD启动速度。
发表于 2022-3-8 10:30:54 | 显示全部楼层
加深了对eval函数的理解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 06:35 , Processed in 0.185976 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表