CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoLISP 开发指南

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

2023-1-6 13:10| 发布者: admin| 查看: 1071| 评论: 0|来自: AutoCAD

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

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

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

定义函数或命令时,必须在参数和局部变量列表中的正斜杠 (/) 之后添加要保持局部的任何变量。例如,下面的示例定义一个名为 的函数,该函数将常量字符串与其他字符串值组合在一起。并且由您在使用该函数时提供的参数填充,但定义为此函数的局部变量。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。这就是为什么在检查变量是否时返回 messageisis 的原因。如果未添加到函数的局部变量列表中,将显示消息 Scope: 全局,并且值更改为“本地”。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"

路过

雷人

握手

鲜花

鸡蛋

最新评论

AutoCAD二次开发.NET源码资料

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

GMT+8, 2024-5-7 08:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部