CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2019 开发者帮助

关于局部变量和全局变量 (AutoLISP)

2024-5-18 17:48| 发布者: admin| 查看: 116| 评论: 0|原作者: admin|来自: AutoCAD

关于局部变量和全局变量 (AutoLISP)

变量的范围可以是局部的,也可以是全局的,具体取决于它们的定义方式。

使用局部变量可确保函数中的变量不受其他用户定义函数和自定义应用程序的影响。在调用函数完成其任务后,这些变量将不再可用。

定义函数或命令时,必须在参数和局部变量列表中的正斜杠 (/) 之后添加任何要保留本地的变量。例如,下面的示例定义一个名为 Function 的函数,该函数将常量字符串与其他字符串值组合在一起。 并由您在使用该函数时提供的参数填充,但定义为此函数的局部变量。ARGTESTarg1arg2ccc

(defun ARGTEST ( arg1 arg2 / ccc )
  (setq ccc "Constant string")
  (strcat ccc ", " arg1 ", " arg2)
)
ARGTEST

(ARGTEST "String 1" "String 2")
"Constant string, String 1, String 2"

函数完成后,将丢失 的值。您可以通过在 AutoCAD 命令提示符下输入以下内容来测试此内容:ccc

!ccc
nil
提示:在完成函数的大部分调试之前,不要将变量设为本地变量。通过不立即将变量声明为本地变量,您可以在函数完成后检查分配给变量的最后一个值。

使用局部变量的另一个优点是,AutoCAD 可以回收这些变量使用的内存空间,而全局变量则在 AutoCAD 内存空间中不断累积。

如果要在函数或命令保持加载状态时在函数或命令的使用之间保留值,或者要在多个函数中使用值,则全局变量会很有帮助。但是,如果所有或许多变量都是全局变量,则最终更改变量值的可能性越来越大,因此它与其他函数不兼容。这可能会导致不可预测的行为,并且很难确定问题的根源。声明全局变量时,最好指示您希望变量是全局变量。一种常见的方法是在变量名称中添加开始和结束星号,例如 。*default-layer*

最初声明的所有变量都是全局变量。下面的代码演示了全局变量和局部变量的使用。

(setq *dr-layer* "Doors")
(defun list-layers ( / cur-layer)
  (setq cur-layer (getvar "clayer"))
  (prompt (strcat "\nCurrent layer: " cur-layer "\nDoor layer: " *dr-layer*))
 (princ)
)
LIST-LAYERS

(list-layers)
Current layer: 0
Door layer: Doors

您可以通过执行以下操作来测试变量中存储的值:

!cur-layer
nil

!*dr-layer*
"Doors"

虽然变量可以在函数中声明为本地变量,但同名变量也可以声明为全局变量。如果将变量名称添加到函数的局部变量列表中,则忽略具有相同名称的全局变量。以下示例代码演示了此行为:

(setq var-scope "Global")
(defun list-scope ( / var-scope)
  (if (/= var-scope nil)
    (prompt (strcat "\nScope: " var-scope))
    (prompt (strcat "\nvar-scope is nil"))
  )

  (setq var-scope "Local")
  (prompt (strcat "\nScope: " var-scope))
 (princ)
)

(list-scope)
var-scope is nil
Scope: Local

!var-scope
"Global"

启动函数时,变量在函数范围内声明为值 nil。这就是为什么在检查变量是否为 时返回消息 is 的原因。如果未添加到函数的局部变量列表中,则会显示消息 Scope: Global,并且 的值更改为“Local”。var-scopevar-scopenilnilvar-scopevar-scope

(setq var-scope "Global")
(defun list-scope ( / )
  (if (/= var-scope nil)
    (prompt (strcat "\nScope: " var-scope))
    (prompt (strcat "\nvar-scope is nil"))
  )

  (setq var-scope "Local")
  (prompt (strcat "\nScope: " var-scope))
 (princ)
)

(list-scope)
Scope: Global
Scope: Local

!var-scope
"Local"

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1   苏公网安备32011402011833)

GMT+8, 2024-12-15 11:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部