明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: mayingjun

[讨论] Lee Mac大神为什么这样写vla容器的函数?

[复制链接]
发表于 2019-8-1 11:58:02 | 显示全部楼层
主要就是那个 list, 把重新定义函数的下的所有代码计算成了值再定义的函数,所以再执行的时候就不会在进行计算了
发表于 2019-8-1 12:00:37 | 显示全部楼层
nzl1116 发表于 2019-8-1 11:57
你确定你看懂了,为什么不直接用变量储存Document对象?

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

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

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

这个重新定义的函数里没有只有值,没有计算
发表于 2019-8-1 12:23:33 | 显示全部楼层
taoyi0727 发表于 2019-8-1 12:07
主要就是他那个list 把计算的代码已经计算成值了后再重新定义的函数

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

还真是,为什么没有执行(alert "a")?难道函数没有参数,就直接返回值?
发表于 2019-8-1 12:28:53 | 显示全部楼层
taoyi0727 发表于 2019-8-1 12:07
主要就是他那个list 把计算的代码已经计算成值了后再重新定义的函数

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

我被你搞偏了,你那个(alert "a")就是 nil
不管怎么说,就是用函数储存,函数要执行defun表达式,而用变量储存什么也不用计算
发表于 2019-8-1 12:33:11 | 显示全部楼层
要么leemac故意耍酷,要么(defun func () val)这种形式确实比一个变量要快。
发表于 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个值,不管你这个函数前面有什么值
发表于 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运算。







发表于 2019-8-2 10:26:33 | 显示全部楼层
那么问题来了,把表达式计算的值存入变量和只计算表达式一次(?)的函数有什么本质区别吗?的确使用函数效率更高?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 15:25 , Processed in 0.165140 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表