baitang36 发表于 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作为局部变量,虽然没用到,但造成了干扰。去掉它就正常了。


baitang36 发表于 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 的意思实际上是设置这个符号的值

hubeiwdlue 发表于 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
_$

baitang36 发表于 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
帖子内容改了一下,你再试试我在研究一下

hubeiwdlue 发表于 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”就会读取出是个函数

hubeiwdlue 发表于 2024-8-27 15:50:21

baitang36 发表于 2024-8-27 14:27
你看到的东西都是符号,符号的名字是个字符串,符号的值可能是函数、变量、数字、字符串。
比如aa是个函 ...

谢谢盛老师的讲解,这些基本的理论和理解,对我们半道出家学lisp的人来说,很陌生。

baitang36 发表于 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函数(入参/局部变量)这个局部变量会保护它,相当于把局部变量全部给换了一个名字(编译之后,内存上面只有顺序的地址没有名),还是要懂其他语言才能深刻认识到
页: [1] 2
查看完整版本: 局部变量不能和全局变量重名