freedom_ice 发表于 2022-12-8 16:45:25

关于lee-mac一个函数的疑问

(defun oa:acdoc nil
    (eval (list 'defun 'oa:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
    (oa:acdoc)
)如上。看起来像是一个递归的函数定义。

nil是否指此函数无参。
用nil而不用空括号来表示无参,似乎也是为了后面eval递归式的函数实现。
他这样写的意图是什么?

zhaoxt 发表于 2022-12-8 19:12:21

当大神在为效率思考讨论的时候,我还在为了实现功能而苦苦思索。

guosheyang 发表于 2022-12-8 18:10:19

晓东论坛 上 曾经讨论过这个,这是我摘抄的里面的原话

;这样写的好处是:第一次调用时,函数会执行(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:32:08

本帖最后由 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)
)

vitalgg 发表于 2022-12-8 17:18:39

nil 和 空表 () 本质上就是一个东西。
(equal nil()) => T
(quual nil '()) => T
(= nil()) => T
(= nil '()) => T

飞雪神光 发表于 2022-12-8 17:37:29

我记得这应该叫 动态函数吧 需要时才生成 看着像递归但是重定义了函数

llsheng_73 发表于 2022-12-8 17:54:35

没看出它和下边这样的本质区别
(defun oa:acdoc nil
    (vla-get-activedocument (vlax-get-acad-object)))

guosheyang 发表于 2022-12-8 18:14:38

只有大量重复调用这个函数时    比如成千上万次 这样用采用意义

自贡黄明儒 发表于 2022-12-8 18:48:05

同下面的效果应该是一样的。
(or **ACAD** (setq **ACAD** (vlax-get-acad-object)))
(or **DOC** (setq **DOC** (vla-get-ActiveDocument **ACAD**)))

wzg356 发表于 2022-12-8 19:58:47

自然理解可以,不能理解没必要研究这种。除非碰上效率不过关需要优化的时候再去考虑,且99.99%不会从这儿入手
页: [1] 2
查看完整版本: 关于lee-mac一个函数的疑问