关于lee-mac一个函数的疑问
(defun oa:acdoc nil(eval (list 'defun 'oa:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
(oa:acdoc)
)如上。看起来像是一个递归的函数定义。
nil是否指此函数无参。
用nil而不用空括号来表示无参,似乎也是为了后面eval递归式的函数实现。
他这样写的意图是什么?
当大神在为效率思考讨论的时候,我还在为了实现功能而苦苦思索。 晓东论坛 上 曾经讨论过这个,这是我摘抄的里面的原话
;这样写的好处是:第一次调用时,函数会执行(vla-get-activedocument (vlax-get-acad-object))这句代码。
;但是以后再执行这个函数,就不会再执行(vla-get-activedocument (vlax-get-acad-object))这个代码.而直接返回其代表的值。相当于设置一个全局变量一样。
这个函数第一次运行后,以后再运行就是执行 EVAL 里面重新定义的函数了
那么关键就是EVAL里的重新定义。这个list里面共四个元素。前三个有'号。最后一个没有。
所以最后一句在第一次执行时候是被运行了的。
重新定义后的函数其实是这样的!
(defun LM:acdoc nil
#<VLA-OBJECT IAcadDocument 0114d320>
)
(执行过一次以后再次检验)
里面已经没有代码了。只有值了。
这个理解是正确的,因为list不加eval只是代表一个列表,加上后相当于对函数重定义一个定值函数,这个函数应用个人理解应该用为每个程序的局部变量使用
本帖最后由 kucha007 于 2022-12-8 18:35 编辑
guosheyang 发表于 2022-12-8 18:10
晓东论坛 上 曾经讨论过这个,这是我摘抄的里面的原话
;这样写的好处是:第一次调用时,函数会执行(vla- ...
赞,补充一个例子。定义后尝试运行多次(LM:acdoc)(defun LM:acdoc nil
(eval (list 'defun
'LM:acdoc
'nil
(menucmd "M=$(edtime,$(getvar,date),当前时间:HH:MM:SS)")
)
);第一次运行时定义函数
(LM:acdoc)
)
nil 和 空表 () 本质上就是一个东西。
(equal nil()) => T
(quual nil '()) => T
(= nil()) => T
(= nil '()) => T 我记得这应该叫 动态函数吧 需要时才生成 看着像递归但是重定义了函数 没看出它和下边这样的本质区别
(defun oa:acdoc nil
(vla-get-activedocument (vlax-get-acad-object))) 只有大量重复调用这个函数时 比如成千上万次 这样用采用意义 同下面的效果应该是一样的。
(or **ACAD** (setq **ACAD** (vlax-get-acad-object)))
(or **DOC** (setq **DOC** (vla-get-ActiveDocument **ACAD**))) 自然理解可以,不能理解没必要研究这种。除非碰上效率不过关需要优化的时候再去考虑,且99.99%不会从这儿入手
页:
[1]
2