明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 668|回复: 15

[经验] 局部变量不能和全局变量重名

[复制链接]
发表于 2024-8-27 10:07:27 | 显示全部楼层 |阅读模式
本帖最后由 baitang36 于 2024-8-27 10:38 编辑

(defun aa()(princ "aaa"))
(defun bb()(princ "bbb"))
(defun get1(str1 /  bb )
  (setq VA1 (vl-symbol-value (read str1)))
  (princ VA1)
  (princ)
)
加载后,执行(get1 "bb"),VA1的值是nil  在函数内(read "bb")得到的是局部变量,不是全局变量。
(get1 "aa")是正常的
bb作为局部变量,虽然没用到,但造成了干扰。去掉它就正常了。


"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-8-27 14:27:13 | 显示全部楼层
本帖最后由 baitang36 于 2024-8-27 16:36 编辑
hubeiwdlue 发表于 2024-8-27 12:53
没看懂,变量名、函数名,符号,他们之间是个什么关系?

你看到的东西都是符号,符号的名字是个字符串,符号的值可能是函数、变量、数字、字符串。
比如aa是个函数,它的符号是'aa,符号的名字是"aa" 符号的值是函数aa
再举个例子 (setq bb 3.14159)  符号是'bb  符号名是"bb"   符号的值是实数3.14159
vl-symbol-value是获取符号的值

命令: (vl-symbol-value 'bb)
3.14159

命令: (vl-symbol-name 'bb)
"BB"



命令: (set 'bb 3.14)
3.14

setq 的意思实际上是设置这个符号的值

评分

参与人数 2明经币 +2 收起 理由
hubeiwdlue + 1 很给力!
自贡黄明儒 + 1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2024-8-28 18:28:46 | 显示全部楼层
你有种再说一遍 发表于 2024-8-28 17:17
如果你在lisp函数(/)斜杆后面不写局部变量名,
那么外部同名的全局变量或者函数是可以穿透进来的,失去保 ...

你这么说,我大概明白了,lisp函数(/)后面的局部变量,lisp会保护这些变量在函数内是独立的,仅作用在函数内部这个独立空间,不会被干扰,也干扰不了其他函数。如果不写入局部变量,就失去了独立空间的保护,就是全局的。
关于(setq 函数 nil),按照盛老师说的,所有看到的都是符号,假设函数的名字是aa,那么字符串aa就是符号'aa的名字,符号'aa的值,是一个函数。(setq aa nil),是给符号重新赋值,这个值是nil。
发表于 2024-8-27 10:29:20 | 显示全部楼层
我试了一下,get谁好像都是nil


_$ (get1 "aa")
nil
_$ (get1"bb")
nil
_$ (get"cc")
no function definition: GET
_$ (get1"cc")
nil
_$
 楼主| 发表于 2024-8-27 10:34:08 | 显示全部楼层
咏郡 发表于 2024-8-27 10:29
我试了一下,get谁好像都是nil

帖子内容改了一下,你再试试
发表于 2024-8-27 10:45:04 | 显示全部楼层
本帖最后由 咏郡 于 2024-8-27 10:46 编辑
baitang36 发表于 2024-8-27 10:34
帖子内容改了一下,你再试试
我在研究一下
发表于 2024-8-27 12:53:59 | 显示全部楼层
没看懂,变量名、函数名,符号,他们之间是个什么关系?
发表于 2024-8-27 13:48:39 | 显示全部楼层
hubeiwdlue 发表于 2024-8-27 12:53
没看懂,变量名、函数名,符号,他们之间是个什么关系?

函数名bb,在get里bb是局部变量,当带入“bb”时,(read “bb”)返回bb此时bb就是变成局部变量了,在用那个函数(我也不知是什么)读取就是nil值。反正“aa”就会读取出是个函数
发表于 2024-8-27 15:50:21 | 显示全部楼层
baitang36 发表于 2024-8-27 14:27
你看到的东西都是符号,符号的名字是个字符串,符号的值可能是函数、变量、数字、字符串。
比如aa是个函 ...

谢谢盛老师的讲解,这些基本的理论和理解,对我们半道出家学lisp的人来说,很陌生。
 楼主| 发表于 2024-8-27 16:32:26 | 显示全部楼层
hubeiwdlue 发表于 2024-8-27 15:50
谢谢盛老师的讲解,这些基本的理论和理解,对我们半道出家学lisp的人来说,很陌生。

我以前也很困惑,后来是通过挖内存里的数据结构来加深理解的
发表于 2024-8-28 16:06:53 | 显示全部楼层
咏郡 发表于 2024-8-27 13:48
函数名bb,在get里bb是局部变量,当带入“bb”时,(read “bb”)返回bb此时bb就是变成局部变量了,在用 ...

函数就是运行时候的栈帧,而lisp函数(入参/局部变量)这个局部变量会保护它,相当于把局部变量全部给换了一个名字(编译之后,内存上面只有顺序的地址没有名),还是要懂其他语言才能深刻认识到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 00:48 , Processed in 0.212450 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表