子功能放置
我有一个lisp文件,其中有多个程序。所有这些程序都使用相同的子功能。我可以只在lisp文件中放置一次,而不是将这些子函数放置在每个程序中吗? 这在某种程度上取决于您如何定义和调用程序(如果定义了这些程序),例如:“defun c:foo(/)”,本质上是将它们作为命令添加到cad程序中,所有子功能都需要在其中定义或以其他方式调用。您可以将所有子函数放在它们自己的主函数中,即“defun c:_subs(subfun/)”,其中subfun将表示要运行的实际子函数,然后从主函数中相应地调用。
在VLIDE中构建/编译函数还有其他方法需要研究。 这样地?
当然!
不,不能。必须从lisp中单独加载子函数,并使其成为全局函数。
如果您运行包含子函数的lisp,并且没有将其从代码中清除,那么它将是全局的。
(defun C:test( / subfunction ) ;will release the sub-function from memory.
;; if sub-function isn't declared then it will be global
;; but this routine must be called first before the other
;; routines can call it.
(subfunction)
(functions)
)
by doing this one below
(subfunction) ; by making this global any of you routine can call this function
(defun C:test2 ()
(subfunction)
)
(defun C:test3 ()
(subfunction)
)
这就是为什么我们将*error*函数声明为局部函数的原因。 杰夫!以上描述是我希望做的。如果我将每个程序中的每个子功能本地化,使它们不是全局的,那么我应该很好地去做,对吗? 我迷路了。我以为我做得对,但和大多数时候一样。。。。我错了。救命啊!
(defun c:TESTALIAS ( / *error* massoc ent elist typ laypipe layalias laycolor alias)
(while (setq ent (entsel "\nSelect CADmep object: "))
(progn
(setq elist (entget (car ent))
typ (cdr (assoc 0 elist))
)
(if (= typ "MAPS_SOLID")
(progn
(setq laypipe (cdr (assoc 8 elist))
layalias (strcat laypipe "-TEXT")
laycolor (cdr (assoc 62 (tblsearch "LAYER" laypipe)))
alias (nth 4 (massoc 300 elist))
)
(if (null (tblsearch "LAYER" layalias))
(progn
(entmake (list '(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
(cons 2 layalias)
'(70 . 0)
(cons 62 laycolor)
'(6 . "Continuous")
'(290 . 1)
'(370 . 25)
)
)
(setvar "clayer" layalias)
)
(setvar "clayer" layalias)
)
(command "mleader" pause pause alias)
)
(prompt "\nNot a CADmep object.")
)
)
)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun *error* (msg)
(if (not (member msg '("Function cancelled" "quit / exit abort")))
(princ (strcat "\nError: " msg))
)
(princ)
)
(defun massoc ( key lst / item )
(if (setq item (assoc key lst))
(cons (cdr item) (massoc key (cdr (member item lst))))
)
) 是否用于线路别名(第4个(massoc 300 elist))?
如果是这样,那么调用子函数的方法必须放在括号中。
别名(第4个((massoc)300 elist))
因为按原样,由于您声明了一个名为massoc的局部var,并且没有将massoc放在括号中,因此它使用局部变量massoc而不是子函数。不要混合变量和子函数。
此外,您不必声明子函数。
还有一个问题,你们的massoc子函数是在试图引用自己吗?
(defun massoc ( key lst / item )
(if (setq item (assoc key lst))
(cons (cdr item) (massoc key (cdr (member item lst))))
)
)
对
我不认为我在使用massoc作为变量。我试图用它作为命名子功能的符号。通过将其放在函数名称“TESTALIAS”后的括号中,它仅将其定位到该函数,对吗?
对我从李·麦克今天早些时候的帖子中得到了这个。 好的,明白了。不管我上一篇文章是什么,(massoc 300 elist)在括号之间,300和elist是两个参数。因此,别名是(nth 4(massoc 300 elist))或从子函数“massoc provided with arguments 300&elist”返回的列表的第5个元素。没有括号缺失。我的错。
据我所知,在(defun c:TESTALIAS(/之后添加任何内容都是声明一个局部变量……但jdiala却不这么说,这让我怀疑
老实说,我从来没有声明过任何子函数,我将密切关注这个线程,因为我认为这没有什么不同。我可能完全错了,但在我看来,你声明了一个不存在的变量massoc,所以它不会改变任何东西。(或者你可能需要声明(massoc)而不是massoc。。。这可以做到吗?)。为了完全让魔鬼拥护,如果你添加了一个massoc变量,你怎么能同时声明局部子函数和局部变量呢?我的头疼^
接下来,假设您确实设法声明了子函数,使其“从内存中释放”。。这样做不是没有用吗?;当生成子函数并希望传递其结果时,必须使用全局变量传递它,或者生成子函数以使其返回值。。当调用不使用全局变量但返回结果的子函数时,根据我所知,返回值但不存储,每次调用子函数时,都会重新计算它。也许我误解了什么。这个帖子很有趣。。。。通过对李·麦克的作品进行大量分析,我们可能会最终导致大脑损伤(但这是值得的!)=D
我希望我没有误导这里的任何人。。 在一个软件包中,我们在所有地方使用子函数,这些子函数只是在启动时加载的,然后它们可以用于任何程序。关于局部和全局变量,你是对的。检查defun(ans/x y)的部分,ans是传递的,x y是局部的。此外,它们也不必是C:defuns基本上可以是C:implies可以从键盘上调用的任何名称,我相信其他人会更喜欢。
页:
[1]
2