mayingjun 发表于 2019-8-1 10:40:08

highflybir 发表于 2019-8-1 10:35
嗯,看来lee是对的,我再仔细看看eval那段.

非常感谢你的分析,我只是恍惚觉得这样写是为了一次求值。通过你的分析才去作测试,从而证实了这种猜想。

ll_j 发表于 2019-8-1 10:59:24

多年以前就讨论过这个问题,但最终也没什么人能说清楚到底有什么必要那么写。

highflybir 发表于 2019-8-1 11:05:49

本帖最后由 highflybir 于 2019-8-1 11:07 编辑


(defun A nil
(eval
    (list 'defun
          'a
          'nil
          (setq i 0)
          (repeat 10000 (setq i (1+ i)))
          (princ i)
    )
)
(a)
)


我给出了上面的一段程序,从这个写法来说,看来,第一次求值后 ,第二次就不用再repeat了。
evallist 和eval' 的效果的确不一样。

ll_j 发表于 2019-8-1 11:09:38

但这有什么必要呢?下次用到这个a函数的时候,a函数是怎样的定义呢?

highflybir 发表于 2019-8-1 11:15:28

ll_j 发表于 2019-8-1 11:09
但这有什么必要呢?下次用到这个a函数的时候,a函数是怎样的定义呢?

如果第一次求值是一件很耗时的事情的时候,就有必要了,就可以不必再求值,只要引用第一次求值的结果。

mayingjun 发表于 2019-8-1 11:26:01

本帖最后由 mayingjun 于 2019-8-1 11:27 编辑

highflybir 发表于 2019-8-1 11:15
如果第一次求值是一件很耗时的事情的时候,就有必要了,就可以不必再求值,只要引用第一次求值的结果。
对,list里面的东西,在eval之前就会被求值,再次运行就不会求值了。而'之内的东西,永远会被eval求值。虽然这种写法,和用一个全局变量相同,只不过是用了一个全局函数。但是弄清楚原理还是非常有必要的。

taoyi0727 发表于 2019-8-1 11:36:52

(defun LM:acdoc ()
(eval (list 'defun 'LM:acdoc '() (alert "a") (vla-get-activedocument (vlax-get-acad-object))))
(alert "b")
(LM:acdoc)
)
(LM:acdoc)

第1交执行会弹出 a 然后重新定义函数 再弹出b 然后在掉用函数 应该还会弹出1次 a ,为什么不就弹了
第2次执行什么都不弹出,为什么?直接就返回值了,既然没有弹出a,那a后面的也没有执行,值是怎么来的?
奇怪了

taoyi0727 发表于 2019-8-1 11:41:57

哦看懂了

(list 'defun 'LM:acdoc '() (alert "a") (vla-get-activedocument (vlax-get-acad-object)))
变成了这个
(DEFUN LM:ACDOC nil nil #<VLA-OBJECT IAcadDocument 0000000030636888>)
他没有用全局变量   他直接把值存在函数里了

highflybir 发表于 2019-8-1 11:53:10

把defun 换成defun-q可能看得更清楚
譬如下面的这段,
(defun A nil
(eval
    (list 'DEFUN-q
          'a
          'nil
          (setq i 0)
          (repeat 10000 (setq i (1+ i)))
          (princ i)
    )
)
(a)
)

$ A
#<USUBR @00000000598ead18 A>
_$ (a)
1000010000
_$ a
(nil 0 10000 10000)
_$

第一次加载函数的时候 ,A是一个函数, 然后 函数执行一次之后 , a函数就变成了变了。
最后的返回值是10000 而不是princ



nzl1116 发表于 2019-8-1 11:57:18

taoyi0727 发表于 2019-8-1 11:41
哦看懂了

(list 'defun 'LM:acdoc '() (alert "a") (vla-get-activedocument (vlax-get-acad-object)) ...

你确定你看懂了,为什么不直接用变量储存Document对象?
页: 1 [2] 3 4
查看完整版本: Lee Mac大神为什么这样写vla容器的函数?