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
那么问题来了,把表达式计算的值存入变量和只计算表达式一次(?)的函数有什么本质区别吗?的确使用函数效率更高?