关于良好代码习惯有助于编译fas以及程序稳定的讨论
本帖最后由 dcl1214 于 2024-4-17 12:09 编辑2015年我开始对cad的【链接】【优化】【内部】【独立空间】【本地】感兴趣(持续几年时间),发现要想全部支持这些编译选项,必须有良好的代码习惯,如果没有良好的代码习惯,所编译出来的fas反编译后直接就是源码,如果养成了良好的代码习惯,编译出来的fas不仅【执行速度快】【函数变成了流水码】【体积缩小到三分之一】(setq后面的变量名字也变成了流水码)(cad自己的很多函数也会改成流水码),而且不容易反编译,即便是反编译出来,代码也失去了可读性了,本帖子重点是讨论良好代码习惯便于编译,大家遇一起讨论
本帖最后由 你有种再说一遍 于 2024-4-15 18:15 编辑
用代码解决代码的事情,直接制作一个lisp编译器,
然后启动编译之后把函数名换成流水号...
还能直接把lisp编译成c++或者c#的dll....
本帖最后由 dcl1214 于 2024-4-15 09:47 编辑
mapcar 后面的 lambda之前必须添加function
例如:
(mapcar '(lambda (a)
(tt a);tt是自定义函数
)
(list 1 2 3 4 5)
)
;以上的tt编译后就是源码,因为一撇是解析执行,所以,cad编译的时候不做流水码处理
;以下的tt编译后不是源码了,因为去掉了一撇,变成了【优化链接】,其函数被cad改成了流水码
(mapcar (function (lambda (a)
(tt a) ;tt是自定义函数
)
)
(list 1 2 3 4 5)
)
本帖最后由 dcl1214 于 2024-4-15 10:28 编辑
全局变量慎用
(SETQ *ACAD* (vlax-get-acad-object)
*DOC*(vla-get-ActiveDocument *ACAD*)
*MS* (vla-get-modelSpace *DOC*)
*PS* (vla-get-paperSpace *DOC*)
)
;改成以下写法:
(SETQ ACAD (vlax-get-acad-object))
(SETQ DOC (vla-get-ActiveDocument (vlax-get-acad-object)))
(SETQ MS (vla-get-modelSpace
(vla-get-ActiveDocument (vlax-get-acad-object))
)
)
(SETQ PS (vla-get-paperSpace
(vla-get-modelSpace
(vla-get-ActiveDocument (vlax-get-acad-object))
)
)
)
;如果以上全局变量被很多地方引用,建议在每一个defun函数内部单独输入,且添加到/后面做成局部变量,编译后,cad可能会改成流水码,连cad自己的函数都可能变成流水码
dcl1214 发表于 2024-4-15 09:25
mapcar 后面的 lambda之前必须添加function
杜老板举个具体的例子么? 本帖最后由 dcl1214 于 2024-4-15 09:37 编辑
set尽可能改成setq
例如:
(mapcar 'set(list 'a 'b)(tt (list (cons "名称" "玉玺")(cons "颜色" ""))))
;改成以下写法
(setq s(tt (list (cons "名称" "玉玺")(cons "颜色" ""))));编译后变量s可能会被改成流水码
(setq a(car s));编译后变量a可能会被改成流水码
(setq b(cadr s));编译后变量b可能会被改成流水码
dcl1214 发表于 2024-4-15 09:28
以下写法不可取,尽可能不要用
(SETQ *ACAD* (vlax-get-acad-object)
*DOC*(vla-get-ActiveDocum ...
那写成什么样好呢? 感觉能跑就行不追求这些 很值得学习。 dcl1214 发表于 2024-4-15 09:28
全局变量慎用
我也不喜欢用全局变量,不过很多用户喜欢记住上次操作的一些值,为下次命令启动时减少输入。所以有时也没办法 本帖最后由 ssyfeng 于 2024-4-15 10:00 编辑
baitang36 发表于 2024-4-15 09:51
很值得学习。
大侠,你对fas了解的这么深入,也分享下心得呀