乐筑天下

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

[编程交流] 声明局部变量(&A)

[复制链接]

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:09:21 | 显示全部楼层 |阅读模式
我希望所有有经验的人都会发现这个问题非常简单,但这里有:
 
我不知道在这两种代码变体中的define函数之后(/)中应该声明什么。在这两种情况下都应该是(a/b)吗?也不
 
此代码具有主功能之外的子功能
  1. (defun c:main_f ( / a )
  2. (alert "\nThis is the main_f")
  3. (setq a "\nThis is from the main_f")
  4. (sub_f)
  5. (alert "This is the main_f again")
  6. (alert b)
  7. (princ)
  8. )
  9. (defun sub_f ( a / b)
  10.    (alert "\nThis is the sub_f")
  11. (alert a)
  12. (setq b "\nThis is from the sub_f")
  13. (princ)
  14. )

 
此代码在主函数中具有子函数
  1. (defun c:main_f ( / a )
  2. (alert "\nThis is the main_f")
  3. (setq a "\nThis is from the main_f")
  4. (sub_f)
  5. (alert "This is the main_f again")
  6. (alert b)
  7. (defun sub_f ( a / b)
  8.    (alert "\nThis is the sub_f")
  9. (alert a)
  10. (setq b "\nThis is from the sub_f")
  11. (princ)
  12. )
  13. (princ)
  14. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:18:41 | 显示全部楼层
这两个示例都不正确-在计算c:main\u f函数时,您会收到“参数太少”错误,因为您没有提供sub\u f函数所需的参数。
 
在我看来,这个问题没有“正确”的答案-答案取决于您需要的功能行为,还有你的个人编码风格(一些程序员喜欢定义一个函数的局部变量,并在另一个函数中引用它们,从定义它们的函数中进行评估;其他人(像我一样)更喜欢避免动态作用域,而是将变量的范围保持在定义它们的函数中)。
 
(编辑:将词汇作用域更改为动态作用域)
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:24:27 | 显示全部楼层
谢谢李。我试图证明变量a被传递到sub\u f,变量b被传递回main\u f,并且在任何地方都没有全局变量。
我很快地编写了上面的代码来演示变量传递,实际上并不是作为一个有效的lisp,尽管它现在可以工作了,但我已经更改了一些东西。然而,我认为变量b是全局的,即使vlide没有这样标记它。
  1. (defun c:main_f ( / a )
  2. (alert "\nThis is the main_f")
  3. (setq a "\nThis is from the main_f")
  4. (sub_f)
  5. (alert "This is the main_f again")
  6. (alert b)
  7. (princ)
  8. )  
  9. (defun sub_f ( / )
  10.    (alert "\nThis is the sub_f")
  11. (alert a)
  12. (setq b "\nThis is from the sub_f")
  13. (princ)
  14. )

 
顺便提一下
词汇作用域听起来像一个棋盘游戏!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:33:22 | 显示全部楼层
抱歉,我之前的帖子应该说动态作用域而不是词汇作用域:动态作用域意味着可以在定义变量的函数中计算的所有函数中引用变量;另一方面,词汇作用域意味着变量仅在定义它的函数的定义中引用。
 
 
在本例中,变量“b”是全局变量,变量“a”在sub\u f中引用,尽管在c中局部定义:main\u f-动态作用域的示例。
 
这种方法的问题是sub\u f现在完全依赖于c:main\u f和这两个函数必须始终一起定义和使用(即sub\u f不能单独用作库函数)。
 
如果要在另一个程序中使用sub\u f,则需要依赖已经定义并保存有效数据的全局变量“a”(相对于sub\u f范围的全局变量),这是我个人避免的途径。
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:38:14 | 显示全部楼层
在上面的代码中,如何使“b”成为局部?
 
我没有想过使用库函数,这是个好主意。我总是从以前的lisp中复制并粘贴代码,然后对其进行相应的修改。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:41:39 | 显示全部楼层
 
这取决于您正在寻找的行为-您可以将符号“b”局部声明为c:main\u f,而不改变当前函数的行为,或者可以将符号“b”局部声明为sub\u f,并使用此函数的返回定义另一个c:main\u f的局部变量。
 
没有一刀切的解决方案。
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:45:28 | 显示全部楼层
在lisp中,我在写atm,我使用了两个子函数,它们都不需要向主函数返回值。根据主函数决定的满足条件,可以调用任何子函数。然而,主函数在while循环中运行,因此任何一个子lisp都会被多次调用,直到执行右键单击,然后退出循环&程序结束。
由于子函数可能会被多次调用,我希望传递的变量返回一个nil值。我可以假设在main下面写一行,其中子函数用一个:
  1. [/(setq myvar nil)CODE] but this seems sloppy coding to me. I thought that if there's a way to localise myvar so that it returns to null after either of the sub-functions has finished using it, it would be a little more 'proffesional'. Perhaps [code]defun sub-function (/myvar)

  1. defun subfunction (myvar/)
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

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

铜币
280
发表于 2022-7-5 18:54:47 | 显示全部楼层
 
李-只要编写代码的人在其所有程序中保持主函数和子函数中使用的变量一致,库子函数在本质上不应该是泛型的吗?例如,在我从这里开始的另一个线程中,我试图创建一个层。这旨在用于多个主要功能中。由于每个主函数创建不同的层,我希望我的子函数使用通用变量。主函数定义层的细节并将其传递给子函数。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:03:01 | 显示全部楼层
 
查看库函数时,将其视为另一个内置AutoLISP函数,显然您无法访问其源代码。那么,您如何知道如何在调用程序中定义变量,以使库函数按预期运行?
 
 
您是否将特定于层的数据作为参数传递给子函数?或者,在评估子函数时,您是否依赖于已经定义的全局变量(相对于子函数范围的全局变量)?
回复

使用道具 举报

55

主题

325

帖子

274

银币

后起之秀

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

铜币
280
发表于 2022-7-5 19:03:29 | 显示全部楼层
 
这是有道理的。
 
 
 
好我试图将主函数中定义的变量作为全局变量传递给子函数。然后我将在我的子函数中对它们进行本地化。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 19:59 , Processed in 2.226807 second(s), 72 queries .

© 2020-2025 乐筑天下

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