乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 34|回复: 15

[编程交流] 子功能放置

[复制链接]

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-5 23:36:40 | 显示全部楼层 |阅读模式
我有一个lisp文件,其中有多个程序。所有这些程序都使用相同的子功能。我可以只在lisp文件中放置一次,而不是将这些子函数放置在每个程序中吗?
回复

使用道具 举报

4

主题

194

帖子

192

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 23:42:11 | 显示全部楼层
这在某种程度上取决于您如何定义和调用程序(如果定义了这些程序),例如:“defun c:foo(/)”,本质上是将它们作为命令添加到cad程序中,所有子功能都需要在其中定义或以其他方式调用。
 
您可以将所有子函数放在它们自己的主函数中,即“defun c:_subs(subfun/)”,其中subfun将表示要运行的实际子函数,然后从主函数中相应地调用。
 
在VLIDE中构建/编译函数还有其他方法需要研究。
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 23:45:26 | 显示全部楼层
这样地?
当然!
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 23:49:32 | 显示全部楼层
 
不,不能。必须从lisp中单独加载子函数,并使其成为全局函数。
 
如果您运行包含子函数的lisp,并且没有将其从代码中清除,那么它将是全局的。
  1. (defun C:test  ( / subfunction ) ;will release the sub-function from memory.
  2.                                 ;; if sub-function isn't declared then it will be global
  3.                                 ;; but this routine must be called first before the other
  4.                                 ;; routines can call it.
  5.                                                                  
  6. (subfunction)
  7. (functions)
  8. )
  9. by doing this one below
  10. (subfunction) ; by making this global any of you routine can call this function
  11. (defun C:test2 ()
  12. (subfunction)
  13. )
  14. (defun C:test3 ()
  15. (subfunction)
  16. )

 
这就是为什么我们将*error*函数声明为局部函数的原因。
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-5 23:52:48 | 显示全部楼层
杰夫!以上描述是我希望做的。如果我将每个程序中的每个子功能本地化,使它们不是全局的,那么我应该很好地去做,对吗?
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-6 00:00:10 | 显示全部楼层
我迷路了。我以为我做得对,但和大多数时候一样。。。。我错了。救命啊!
 
  1. (defun c:TESTALIAS ( / *error* massoc ent elist typ laypipe layalias laycolor alias)
  2. (while (setq ent (entsel "\nSelect CADmep object: "))
  3.    (progn
  4.      (setq elist (entget (car ent))
  5.              typ (cdr (assoc 0 elist))
  6.      )
  7.      (if (= typ "MAPS_SOLID")            
  8.        (progn
  9.          (setq laypipe (cdr (assoc 8 elist))
  10.               layalias (strcat laypipe "-TEXT")
  11.               laycolor (cdr (assoc 62 (tblsearch "LAYER" laypipe)))
  12.                  alias (nth 4 (massoc 300 elist))
  13.          )
  14.          (if (null (tblsearch "LAYER" layalias))
  15.            (progn
  16.              (entmake (list '(0 . "LAYER")
  17.                             '(100 . "AcDbSymbolTableRecord")
  18.                             '(100 . "AcDbLayerTableRecord")
  19.                              (cons 2 layalias)
  20.                             '(70 . 0)
  21.                              (cons 62 laycolor)
  22.                             '(6 . "Continuous")
  23.                             '(290 . 1)
  24.                             '(370 . 25)
  25.                       )
  26.              )
  27.              (setvar "clayer" layalias)
  28.            )
  29.            (setvar "clayer" layalias)
  30.          )
  31.          (command "mleader" pause pause alias)
  32.        )
  33.        (prompt "\nNot a CADmep object.")
  34.      )
  35.    )
  36. )
  37. (princ)
  38. )
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. (defun *error* (msg)
  41. (if (not (member msg '("Function cancelled" "quit / exit abort")))
  42.      (princ (strcat "\nError: " msg))
  43. )
  44. (princ)
  45. )
  46. (defun massoc ( key lst / item )
  47. (if (setq item (assoc key lst))
  48.      (cons (cdr item) (massoc key (cdr (member item lst))))
  49. )
  50. )
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-6 00:03:23 | 显示全部楼层
是否用于线路别名(第4个(massoc 300 elist))?
如果是这样,那么调用子函数的方法必须放在括号中。
别名(第4个((massoc)300 elist))
因为按原样,由于您声明了一个名为massoc的局部var,并且没有将massoc放在括号中,因此它使用局部变量massoc而不是子函数。不要混合变量和子函数。
此外,您不必声明子函数。
 
 
还有一个问题,你们的massoc子函数是在试图引用自己吗?
  1. (defun massoc ( key lst / item )
  2. (if (setq item (assoc key lst))
  3.      (cons (cdr item) ([b]massoc[/b] key (cdr (member item lst))))
  4. )
  5. )
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
280
发表于 2022-7-6 00:07:38 | 显示全部楼层
 

 
 
我不认为我在使用massoc作为变量。我试图用它作为命名子功能的符号。通过将其放在函数名称“TESTALIAS”后的括号中,它仅将其定位到该函数,对吗?
 
 
对我从李·麦克今天早些时候的帖子中得到了这个。
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-6 00:08:57 | 显示全部楼层
好的,明白了。不管我上一篇文章是什么,(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
我希望我没有误导这里的任何人。。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 00:14:17 | 显示全部楼层
在一个软件包中,我们在所有地方使用子函数,这些子函数只是在启动时加载的,然后它们可以用于任何程序。关于局部和全局变量,你是对的。检查defun(ans/x y)的部分,ans是传递的,x y是局部的。此外,它们也不必是C:defuns基本上可以是C:implies可以从键盘上调用的任何名称,我相信其他人会更喜欢。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 00:35 , Processed in 0.718086 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表