taoyi0727 发表于 2019-8-1 11:58:02

主要就是那个 list, 把重新定义函数的下的所有代码计算成了值再定义的函数,所以再执行的时候就不会在进行计算了

taoyi0727 发表于 2019-8-1 12:00:37

nzl1116 发表于 2019-8-1 11:57
你确定你看懂了,为什么不直接用变量储存Document对象?

对呀他这个就是没有用变量来储存用的是函数来储存
难到不是这样吗?

nzl1116 发表于 2019-8-1 12:03:12

taoyi0727 发表于 2019-8-1 12:00
对呀他这个就是没有用变量来储存用的是函数来储存
难到不是这样吗?

是啊,用函数来储存,每次用的时候都要计算储存的表达式,而直接用变量来储存,就不用计算了。

taoyi0727 发表于 2019-8-1 12:07:09

nzl1116 发表于 2019-8-1 12:03
是啊,用函数来储存,每次用的时候都要计算储存的表达式,而直接用变量来储存,就不用计算了。

主要就是他那个list 把计算的代码已经计算成值了后再重新定义的函数

这个重新定义的函数里没有只有值,没有计算

nzl1116 发表于 2019-8-1 12:23:33

taoyi0727 发表于 2019-8-1 12:07
主要就是他那个list 把计算的代码已经计算成值了后再重新定义的函数

这个重新定义的函数里没有只有值, ...

还真是,为什么没有执行(alert "a")?难道函数没有参数,就直接返回值?

nzl1116 发表于 2019-8-1 12:28:53

taoyi0727 发表于 2019-8-1 12:07
主要就是他那个list 把计算的代码已经计算成值了后再重新定义的函数

这个重新定义的函数里没有只有值, ...

我被你搞偏了,你那个(alert "a")就是 nil
不管怎么说,就是用函数储存,函数要执行defun表达式,而用变量储存什么也不用计算

nzl1116 发表于 2019-8-1 12:33:11

要么leemac故意耍酷,要么(defun func () val)这种形式确实比一个变量要快。

taoyi0727 发表于 2019-8-1 12:45:29

nzl1116 发表于 2019-8-1 12:28
我被你搞偏了,你那个(alert "a")就是 nil
不管怎么说,就是用函数储存,函数要执行defun表达式,而用变 ...

我说的肯定是对的
(eval (list 'defun 'LM:acdoc '() (alert "a") (vla-get-activedocument (vlax-get-acad-object))));先计算(alert "a"),返回nil

(eval (list 'defun 'LM:acdoc nil nil (vla-get-activedocument (vlax-get-acad-object))))
;再计算vlax-get-acad-object,返回对象

(eval (list 'defun 'LM:acdoc nil nil (vla-get-activedocument #<VLA-OBJECT IAcadApplication 00007ff71ec6c910>)))
;再计算vla-get-activedocument,返回对象

(eval (list 'defun 'LM:acdoc nil nil #<VLA-OBJECT IAcadDocument 0000000030636888>)
;然后list得到一个表(DEFUN LM:ACDOC nil nil #<VLA-OBJECT IAcadDocument 0000000030636888>),这个表里的都是值,不再是代码
再然后就是重新定义函数,这个函数里的只有值,你再调用函数时肯定不会再计算了,直接就返回值了.

他就是把值存在了函数里

就相当于
(defun LM:ACDOC ()
"a"
1
nil
2
)
这个函数里只有值 ,不可能有其它东西
你再调用的时候,他只返回最后的1个值,不管你这个函数前面有什么值

urings 发表于 2019-8-1 17:34:32

本帖最后由 urings 于 2019-8-1 20:53 编辑


(defun Y ()
(alert "我始终存在,但不会被再次调用了!")
(vla-get-activedocument (vlax-get-acad-object))
)

(defun X nil   *标记*
(alert "我将要被下一行代码重写了,以后就没有我了!");这里只会被执行一次。
(eval (list 'defun 'X 'nil (Y)));;这里只会被执行一次。
(X) ;不会进入*标记*位置,也不会进入Y函数。**容易进入误区的地方**
)

这样写的好处:(eval (list 'defun 'X 'nil (+ 2 2))) 等同于(defun x nil 4)
eval以后再调用X函数时,不用进行2加2运算。

而(eval '(defun X nil (+ 2 2))) 等同于(defun x nil (+ 2 2))
eval以后再调用X函数时,还要进行2加2运算。







ll_j 发表于 2019-8-2 10:26:33

那么问题来了,把表达式计算的值存入变量和只计算表达式一次(?)的函数有什么本质区别吗?的确使用函数效率更高?
页: 1 2 [3] 4
查看完整版本: Lee Mac大神为什么这样写vla容器的函数?