明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 894|回复: 23

[讨论] 关于良好代码习惯有助于编译fas以及程序稳定的讨论

  [复制链接]
发表于 2024-4-15 09:23 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2024-4-17 12:09 编辑

2015年我开始对cad的【链接】【优化】【内部】【独立空间】【本地】感兴趣(持续几年时间),发现要想全部支持这些编译选项,必须有良好的代码习惯,如果没有良好的代码习惯,所编译出来的fas反编译后直接就是源码,如果养成了良好的代码习惯,编译出来的fas不仅【执行速度快】【函数变成了流水码】【体积缩小到三分之一】(setq后面的变量名字也变成了流水码)(cad自己的很多函数也会改成流水码),而且不容易反编译,即便是反编译出来,代码也失去了可读性了,本帖子重点是讨论良好代码习惯便于编译,大家遇一起讨论

评分

参与人数 7明经币 +7 收起 理由
magicheno + 1 很给力!
tigcat + 1 很给力!
guosheyang + 1 赞一个!
飞雪神光 + 1 赞一个!
ssyfeng + 1 很给力!
自贡黄明儒 + 1 很给力!
baitang36 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-4-15 16:42 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-4-15 18:15 编辑

用代码解决代码的事情,直接制作一个lisp编译器,
然后启动编译之后把函数名换成流水号...
还能直接把lisp编译成c++或者c#的dll....
回复 支持 1 反对 1

使用道具 举报

 楼主| 发表于 2024-4-15 09:28 | 显示全部楼层
本帖最后由 dcl1214 于 2024-4-15 10:28 编辑

全局变量慎用
  1. (SETQ *ACAD* (vlax-get-acad-object)
  2.       *DOC*  (vla-get-ActiveDocument *ACAD*)
  3.       *MS*   (vla-get-modelSpace *DOC*)
  4.       *PS*   (vla-get-paperSpace *DOC*)
  5. )
  6. ;改成以下写法:

  7. (SETQ ACAD (vlax-get-acad-object))
  8. (SETQ DOC (vla-get-ActiveDocument (vlax-get-acad-object)))
  9. (SETQ MS (vla-get-modelSpace
  10.            (vla-get-ActiveDocument (vlax-get-acad-object))
  11.          )
  12. )
  13. (SETQ PS (vla-get-paperSpace
  14.            (vla-get-modelSpace
  15.              (vla-get-ActiveDocument (vlax-get-acad-object))
  16.            )
  17.          )
  18. )
  19. ;如果以上全局变量被很多地方引用,建议在每一个defun函数内部单独输入,且添加到  /  后面做成局部变量,编译后,cad可能会改成流水码,连cad自己的函数都可能变成流水码




 楼主| 发表于 2024-4-15 09:25 | 显示全部楼层
本帖最后由 dcl1214 于 2024-4-15 09:47 编辑

mapcar 后面的 lambda之前必须添加function
例如:

  1. (mapcar        '(lambda (a)
  2.            (tt a);tt是自定义函数
  3.          )
  4.         (list 1 2 3 4 5)
  5. )
  6. ;以上的tt编译后就是源码,因为一撇是解析执行,所以,cad编译的时候不做流水码处理

  7. ;以下的tt编译后不是源码了,因为去掉了一撇,变成了【优化链接】,其函数被cad改成了流水码
  8. (mapcar        (function (lambda (a)
  9.                     (tt a)                ;tt是自定义函数
  10.                   )
  11.         )
  12.         (list 1 2 3 4 5)
  13. )



发表于 2024-4-15 09:28 | 显示全部楼层
dcl1214 发表于 2024-4-15 09:25
mapcar 后面的 lambda之前必须添加function

杜老板举个具体的例子么?
 楼主| 发表于 2024-4-15 09:35 | 显示全部楼层
本帖最后由 dcl1214 于 2024-4-15 09:37 编辑

set  尽可能改成setq  
例如:
  1. (mapcar 'set(list 'a 'b)(tt (list (cons "名称" "玉玺")(cons "颜色" ""))))
  2. ;改成以下写法
  3. (setq s(tt (list (cons "名称" "玉玺")(cons "颜色" ""))));编译后变量s可能会被改成流水码
  4. (setq a(car s));编译后变量a可能会被改成流水码
  5. (setq b(cadr s));编译后变量b可能会被改成流水码

发表于 2024-4-15 09:37 | 显示全部楼层
dcl1214 发表于 2024-4-15 09:28
以下写法不可取,尽可能不要用
(SETQ *ACAD* (vlax-get-acad-object)
      *DOC*  (vla-get-ActiveDocum ...

那写成什么样好呢?
发表于 2024-4-15 09:50 | 显示全部楼层
感觉能跑就行  不追求这些
发表于 2024-4-15 09:51 | 显示全部楼层
很值得学习。
发表于 2024-4-15 09:51 | 显示全部楼层

我也不喜欢用全局变量,不过很多用户喜欢记住上次操作的一些值,为下次命令启动时减少输入。所以有时也没办法
发表于 2024-4-15 09:58 | 显示全部楼层
本帖最后由 ssyfeng 于 2024-4-15 10:00 编辑

大侠,你对fas了解的这么深入,也分享下心得呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-1 00:41 , Processed in 0.632687 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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