找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: wowan1314

[已解决] 哪位大大来解释下这个函数为什么是这样的写法?

[复制链接]
发表于 2014-12-7 01:56:35 | 显示全部楼层
本帖最后由 wzg356 于 2014-12-7 02:03 编辑

有意思,对lisp感兴趣,时间短,对lisp有些概念还不明白
查字典翻译下板凳的意思,不对的请指正
以下是原作者的解释(我蹩脚的翻译)

The use of defun-q will help to explain the difference:
这个函数的使用将帮助解释其不同之处:

Consider the following functions:
看看接下来的功能:

(defun-q f1 nil
    (vla-get-activedocument (vlax-get-acad-object))
)

(defun-q f2 nil
    (eval (list 'defun-q 'f2 'nil (vla-get-activedocument (vlax-get-acad-object))))
    (f2)
)

Before function evaluation, the respective function definitions are as follows:
函数求值前,其各自的函数定义如下:

_$ (f1)   (注:应该是!F1吧)
(nil (vla-get-ActiveDocument (vlax-get-acad-object)))
_$ (f2)   (注:应该是!F2吧)
(nil (eval (list (quote defun-q) (quote F2) (quote nil) (vla-get-ActiveDocument (vlax-get-acad-object)))) (F2))

When evaluated, both functions will return the Active Document object:
求值后,二者将返回激活的Document对象

_$ (f1)
#<VLA-OBJECT IAcadDocument 0ceb5b6c>
_$ (f2)
#<VLA-OBJECT IAcadDocument 0ceb5b6c>

However, observe the respective function definitions following function evaluation:
好啦,仔细观察各自的函数定义接下来的函数值

_$ f1
(nil (vla-get-ActiveDocument (vlax-get-acad-object)))
_$ f2
(nil #<VLA-OBJECT IAcadDocument 0ceb5b6c>)

Note that function f2 now no longer retrieves the Application Object (vlax-get-acad-object)
before retrieving the Active Document Property (vla-get-activedocument),
but simply returns the Active Document object directly.
The method is similar to setting a global variable pointing to the Active Document Object.

注意,那个函数f2在取回激活的Document属性(vla-get-activedocument)之前,
没有取回应用程序对象 (vlax-get-acad-object)的过程,
但却直接简单地返回激活的Document对象。
这种方法是类似于去设置一个全局变量去指向激活的Document对象

Of course, for this program, I could have equivalently used a local variable assigned with the Active Document Object, however, such local variable would then be re-assigned this value for every use of the program.
&#171; Last Edit: June 04, 2013, 07:53:20 am by Lee Mac &#187;

当然,针对这个程序,我本来可以同样使用一个局部变量非配给激活的Document对象,
不管怎样,如此的局域变量然后将会为每个程序的使用重新分配这个值
&#171; 最后编辑: 2013年6月4日 上午07:53:20  作者 Lee Mac &#187;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 195个

财富等级: 日进斗金

发表于 2014-12-7 02:42:05 来自手机 | 显示全部楼层
问题问的好!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 396个

财富等级: 日进斗金

发表于 2015-5-21 19:24:24 | 显示全部楼层
好文章,虽然没看懂,做个标记吧,以后再过来学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 602个

财富等级: 财运亨通

发表于 2016-2-19 15:42:23 | 显示全部楼层
学习了,学习楼主!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2016-11-21 22:08:02 | 显示全部楼层
啥也不说了,感谢楼主分享哇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-7-20 12:24:40 | 显示全部楼层
谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 769个

财富等级: 财运亨通

发表于 2017-7-20 14:07:37 | 显示全部楼层
到底应该怎么理解呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 14个

财富等级: 恭喜发财

发表于 2017-7-20 17:05:48 | 显示全部楼层
把所有回贴都观摩学习过了,然后开始迷糊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2018-9-30 14:09:09 | 显示全部楼层

嗨,在我看来,LM大师使用另一种方式来定义acdoc变量功能!

楼上 @wzg356: f1 f2 的分别 , 对应该是 f2

(eval (list 'defun-q 'f2 'nil (vla-get-activedocument (vlax-get-acad-object))))
(vla-propagate ‘f2) 变量可以传播至另一dwg文件,
而f1却不能!

我在其它论坛看过使用LM:acdoc的类似帖子在此分享
但没有权限发布链接url

只能复制源码:
(defun err:config ( prog lst )
;hanhphuc
(eval (list 'defun-q
'*error*
'(msg)
prog       
(list 'if (list 'and '(eval msg)
(list 'vl-every ''not
(vl-list* 'list '(wcmatch (strcase msg) "*CANCEL*,*EXIT*,*BREAK*")
         lst )
             )
      )
'(princ (strcat "\n; error: " msg))
)  
'(princ)
)
      )
'*error*
)

  1. (err:config '(ai_sysvar nil)  nil)


调试:
(vl-propagate '*error*) ;不行

(setq *error* *olderror*)
(err:config);注意:刮号不可忽例!

(vl-propagate '*error*) ;变量也可以传播至另一dwg文件了。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-29 15:40 , Processed in 0.268490 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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