乐筑天下

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

[编程交流] 子功能放置

[复制链接]

1

主题

116

帖子

115

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 00:19:26 | 显示全部楼层
套用比尔·克莱默的一本关于Lisp程序的书
在VisualLISP的上下文中,一切都是一个符号。当符号用于保存值时,它被称为变量。当符号用于保存函数定义列表时,它被称为函数
所以是的,当你定位一个变量(读作“符号”)时,不管它持有什么,它都有相同的效果。
我试着从VLIDE上传一些截图,在加载LISP并调用它运行后显示这三个符号的内容,但论坛没有玩球。所以我将在文本中尝试模仿这一点:
 
加载例程后:
*错误*=#
C: TESTALIAS=#
质量=#
 
这表明这三个功能(用户SUBR)很好。
 
但是在调用例程之后:
*误差*=零
C: TESTALIAS=#
质量=零
 
本地化的两个符号显示为nil。因此,是的,本地化包含函数的符号将使其无法使用。
 
这意味着,如果希望其他函数可以使用这些函数,请保持例程不变,但从局部符号列表中删除函数名。
 
或者,在主defun的外括号内定义函数,如下所示。
  1. (defun c:TESTALIAS ( / *error* massoc ent elist typ laypipe layalias laycolor alias)
  2. ;------------------------------------------------------------------
  3. (defun *error* (msg)
  4.    (if (not (member msg '("Function cancelled" "quit / exit abort")))
  5.      (princ (strcat "\nError: " msg))
  6.      )
  7.    (princ)
  8.    )
  9. ;------------------------------------------------------------------
  10. (defun massoc ( key lst / item )
  11.    (if (setq item (assoc key lst))
  12.      (cons (cdr item) (massoc key (cdr (member item lst))))
  13.      )
  14.    )
  15. ;------------------------------------------------------------------
  16. (while (setq ent (entsel "\nSelect CADmep object: "))
  17.    (progn
  18.      (setq elist (entget (car ent))
  19.            typ (cdr (assoc 0 elist))
  20.            )
  21.      (if (= typ "MAPS_SOLID")
  22.        (progn
  23.          (setq laypipe (cdr (assoc 8 elist))
  24.                layalias (strcat laypipe "-TEXT")
  25.                laycolor (cdr (assoc 62 (tblsearch "LAYER" laypipe)))
  26.                alias (nth 4 (massoc 300 elist))
  27.                )
  28.          (if (null (tblsearch "LAYER" layalias))
  29.            (progn
  30.              (entmake (list '(0 . "LAYER")
  31.                             '(100 . "AcDbSymbolTableRecord")
  32.                             '(100 . "AcDbLayerTableRecord")
  33.                             (cons 2 layalias)
  34.                             '(70 . 0)
  35.                             (cons 62 laycolor)
  36.                             '(6 . "Continuous")
  37.                             '(290 . 1)
  38.                             '(370 . 25)
  39.                             )
  40.                       )
  41.              (setvar "clayer" layalias)
  42.              )
  43.            (setvar "clayer" layalias)
  44.            )
  45.          (command "mleader" pause pause alias)
  46.          )
  47.        (prompt "\nNot a CADmep object.")
  48.        )
  49.      )
  50.    )
  51. (princ)
  52. )
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-6 00:23:16 | 显示全部楼层
非常有趣。谢谢分享!
 
当你本地化一个变量(读作“符号”)时,不管它包含什么,它都具有相同的效果。该语句有点可疑,因为它似乎没有相同的效果,这取决于符号存储的是变量还是函数。如果我们以这个简单的例程为例
然后我们定义一个符号来包含一个具有不同值的全局变量x,比如22,然后运行测试例程。包含函数变量x的“局部”符号将存储33,然后被解除。但是,包含外部定义的全局变量x的符号将保留并保持其值。
可能是因为如果在主命令中定义了massoc(在主命令中声明为局部),则没有massoc,但另一个简单的测试表明,符号在存储变量或子函数时的反应不同。 
让我们尝试另一个测试,将符号x定义为局部变量,而不在例程中重新定义它。
  1. 6

同样的结果,定义的包含全局变量x的符号仍然保留。。。而如果执行的函数将所述符号声明为局部变量,则包含子函数(已定义)的符号将失去其定义。 
除非有什么我忽略了要考虑的,否则我不同意这样的说法:“当你定位一个变量(读作“符号”)时,不管它持有什么,它都有相同的效果。”
非常非常有趣的线程。
 
@ksperopoulos:如果你从c:TESTALIAS的局部符号中删除massoc,它有效吗?
回复

使用道具 举报

1

主题

116

帖子

115

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 00:28:40 | 显示全部楼层
嗨,杰夫,
 
谢谢你的评论。我可能不擅长解释这些事情。
 
如果我在我的解释中添加以下内容会有所帮助:一旦主函数C:TESTALIAS完成,您将再次看到绑定到相关函数的符号*ERROR*和MASSOC?
 
如下所示:
 
*错误*=#
C: TESTALIAS=#
质量=#
 
只有在函数运行时(并且这些符号在正在执行的函数的上下文中是“局部的”),符号才似乎失去了定义。同时,在函数之外,这些变量仍然存在并保持其全局值。
这正是你在上一篇文章中举例子时提到的。
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

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

铜币
280
发表于 2022-7-6 00:31:01 | 显示全部楼层
 
对当我从局部变量中删除massoc时,程序就像预期的那样工作。
 
 
当您的代码中有*error*子函数时,您没有本地化它吗?
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-6 00:36:30 | 显示全部楼层
当然你很擅长解释!有时,即使一些概念或语境需要进一步澄清才能完全理解,但这并不意味着解释者不擅长。LISP和VisualLISP很复杂,掌握每件事并不总是显而易见的。
现在一切都有意义了。
如果您声明一个局部符号,就像我的所有示例一样,您可以使用任何已经定义的符号,而不会影响它们。如果在函数中声明局部符号并调用该符号,它将查找局部变量。如果到你使用它的时候还没有定义,那么问题就来了。
  1. 7

比尔·克莱默(BillKramer)是对的:所以无论符号包含变量还是函数,它们的反应都是一样的。 
 
是否本地化*错误*符号?当你这样做的时候,我打赌你在函数的第一行定义了它?
 
 
好我还有很多东西要学。我阅读并根据需要学习函数,每天都会发现新的东西、概念和函数。我甚至还没有掌握“误差”函数的概念。这是我的任务清单,也是我下一个里程碑。
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

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

铜币
280
发表于 2022-7-6 00:39:36 | 显示全部楼层
LeeMac在他的网站上有一些关于错误处理的好文章。他这样做,即使是我也能理解(至少我认为我理解)!我在等李拿出一本关于这方面的书。我要买他的第一本!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 00:41 , Processed in 0.390040 second(s), 62 queries .

© 2020-2025 乐筑天下

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