本帖最后由 e2002 于 2025-2-19 15:46 编辑
建议 AutoLISP编码的一般规范:
1. AutoLISP 提供的标准函数, 全小写 ,例如: initget , getfiled,polar ...
2. 对齐括号:一句代码,分多行时,结束的括号对齐开始括号,并单独写在一行(虽然有人认为这个多余,但实际上按这个规定写,能少很多错误,也容易看清楚代码结构):
- (foo var0 value0
- var1 value1
- );_对齐foo前面那个开始括号
复制代码
3. 普通变量名称:
3.1 一些长期一来,AutoLISP圈内习惯的如:图元名 en,图元表 el ,图元类型 etype 等,按习惯这么就好。
3.2 repeat 循环变量,lambda变量,一般用单个英文字母,如果整形,一般 i,j,k,m,n;其他 x,y,z,u,v,w。
3.2 匈牙利命名法,对于AutoLISP还是推荐使用(毕竟没有 VS 那样强劲的IDE辅助):
按变量类别:rLength, iCount, sText, bIsLoked, lrAreas (l 表示 list,r表示 real); l_sSerial_ptCenter (list, 其中每个item为子list或者dotpair,例如:( ( "256" (24.3 28.7 0.0) ); ( ( "256" . (24.3 28.7 0.0))
3.3 其他的普通变量,一般用简洁、准确的英语单词,Camal 或者 snake_mode 模式,例如 ptStart, rAngleFromXAxis , iTotalPages。
3.4 使用了对象,方法:对象名称,建议与 C#一致。
常用的习惯的如 acApp,acDoc,acSpace等;
一般的对象,简单的可以直接全小写,例如 line,layer (因为vscode或者vlide对标准函数都有高亮显示,颜色与同位全小写的对象名称能显著的区分);
对象特性或方法,一般写为: vla-get-CapWord,vla-Method , 例如 (vla-get-Count obj), (vla-GetBoundingBox obj 'ptMin 'ptMin);
3.5 函数名称与子函数名称:与变量基本一致,建议采用 snake_Mode, 这样能一眼看出这是函数而不是变量,函数内定义的子函数,建议采用 "_"开头,这样能一眼看出这是内部使用的子函数,例如:(defun _mainProgram_internalFunction (par0 par1 / ...) ...
4. 语句块格式:
主要是 if,while, repeat, foreach,cond 这些:
4.1 简单的if,可以直接一行:(if bFlag (_do_SomeThing var))
如果有 else或者包含很多语句, 一般分开多行:
 - (if (setq esl (entsel))
- (progn
- (...)
- (...)
- );_progn, then
- (progn
- (...)
- (...)
- );_progn, else
- );_fi
4.2 AutoLISP 只有 while ,没有 do...while:
要使用do...while,可以用:

- (setq bLoop T)
- (while bloop
- (...)
- (if condition
- (setq bLoop nil);_在某种条件下,设置标记值bLoop= nil,用于退出while循环。
- );_fi
- (...)
- );_while
-
4.3 repeat 适用与循环次数已知且不变的情况:
- (repeat iCount
- (do_something ...)
- (...)
- )
复制代码 4.4 cond: 类似 C#中的 switch...case,但个人认为cond 比switch...case 要灵活多了,switch...case中的 case太死板了,而cond 中的各种条件,只需要条件语句的返回值 not nil 即可执行后面的一系列语句,且不需要写一堆 break。- (cond
- ( (do_check_function0 var0) (do_something0)(do_something1 ...) (...) )
- ( (do_check_function1 var1) (...) (...) (...) );_注意这里在条件判断语句之后可以有很多执行的语句,且不需要象if中那样必须用progn包起来,这一点比较符合习惯。
- ( (conditons...) (...) (...) (...) )
- );_cond
复制代码
|