明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2152|回复: 13

[讨论] 关于lee-mac一个函数的疑问

[复制链接]
发表于 2022-12-8 16:45:25 | 显示全部楼层 |阅读模式
  1. (defun oa:acdoc nil
  2.     (eval (list 'defun 'oa:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
  3.     (oa:acdoc)
  4. )
如上。看起来像是一个递归的函数定义。

nil是否指此函数无参。
用nil而不用空括号来表示无参,似乎也是为了后面eval递归式的函数实现。
他这样写的意图是什么?
发表于 2022-12-8 19:12:21 | 显示全部楼层
当大神在为效率思考讨论的时候,我还在为了实现功能而苦苦思索。
回复 支持 1 反对 0

使用道具 举报

发表于 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只是代表一个列表,加上后相当于对函数重定义一个定值函数,这个函数应用个人理解应该用为每个程序的局部变量使用

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-8 18:32:08 | 显示全部楼层
本帖最后由 kucha007 于 2022-12-8 18:35 编辑
guosheyang 发表于 2022-12-8 18:10
晓东论坛 上 曾经讨论过这个,这是我摘抄的里面的原话

;这样写的好处是:第一次调用时,函数会执行(vla- ...

赞,补充一个例子。定义后尝试运行多次(LM:acdoc)
  1. (defun LM:acdoc nil
  2.   (eval (list 'defun
  3.               'LM:acdoc
  4.               'nil
  5.               (menucmd "M=$(edtime,$(getvar,date),当前时间:HH:MM:SS)")
  6.         )
  7.   );第一次运行时定义函数
  8.   (LM:acdoc)
  9. )

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2022-12-8 17:18:39 | 显示全部楼层
nil 和 空表 () 本质上就是一个东西。
(equal nil  ()) => T
(quual nil '()) => T
(= nil  ()) => T
(= nil '()) => T
发表于 2022-12-8 17:37:29 | 显示全部楼层
我记得这应该叫 动态函数吧 需要时才生成 看着像递归  但是重定义了函数
发表于 2022-12-8 17:54:35 | 显示全部楼层
没看出它和下边这样的本质区别
(defun oa:acdoc nil
    (vla-get-activedocument (vlax-get-acad-object)))
发表于 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**)))
发表于 2022-12-8 19:58:47 来自手机 | 显示全部楼层
自然理解可以,不能理解没必要研究这种。除非碰上效率不过关需要优化的时候再去考虑,且99.99%不会从这儿入手
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 22:28 , Processed in 0.173423 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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