局部变量不能和全局变量重名
本帖最后由 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 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 的意思实际上是设置这个符号的值
你有种再说一遍 发表于 2024-8-28 17:17
如果你在lisp函数(/)斜杆后面不写局部变量名,
那么外部同名的全局变量或者函数是可以穿透进来的,失去保 ...
你这么说,我大概明白了,lisp函数(/)后面的局部变量,lisp会保护这些变量在函数内是独立的,仅作用在函数内部这个独立空间,不会被干扰,也干扰不了其他函数。如果不写入局部变量,就失去了独立空间的保护,就是全局的。
关于(setq 函数 nil),按照盛老师说的,所有看到的都是符号,假设函数的名字是aa,那么字符串aa就是符号'aa的名字,符号'aa的值,是一个函数。(setq aa nil),是给符号重新赋值,这个值是nil。 我试了一下,get谁好像都是nil
_$ (get1 "aa")
nil
_$ (get1"bb")
nil
_$ (get"cc")
no function definition: GET
_$ (get1"cc")
nil
_$ 咏郡 发表于 2024-8-27 10:29
我试了一下,get谁好像都是nil
帖子内容改了一下,你再试试 本帖最后由 咏郡 于 2024-8-27 10:46 编辑
baitang36 发表于 2024-8-27 10:34
帖子内容改了一下,你再试试我在研究一下
没看懂,变量名、函数名,符号,他们之间是个什么关系? hubeiwdlue 发表于 2024-8-27 12:53
没看懂,变量名、函数名,符号,他们之间是个什么关系?
函数名bb,在get里bb是局部变量,当带入“bb”时,(read “bb”)返回bb此时bb就是变成局部变量了,在用那个函数(我也不知是什么)读取就是nil值。反正“aa”就会读取出是个函数 baitang36 发表于 2024-8-27 14:27
你看到的东西都是符号,符号的名字是个字符串,符号的值可能是函数、变量、数字、字符串。
比如aa是个函 ...
谢谢盛老师的讲解,这些基本的理论和理解,对我们半道出家学lisp的人来说,很陌生。 hubeiwdlue 发表于 2024-8-27 15:50
谢谢盛老师的讲解,这些基本的理论和理解,对我们半道出家学lisp的人来说,很陌生。
我以前也很困惑,后来是通过挖内存里的数据结构来加深理解的 咏郡 发表于 2024-8-27 13:48
函数名bb,在get里bb是局部变量,当带入“bb”时,(read “bb”)返回bb此时bb就是变成局部变量了,在用 ...
函数就是运行时候的栈帧,而lisp函数(入参/局部变量)这个局部变量会保护它,相当于把局部变量全部给换了一个名字(编译之后,内存上面只有顺序的地址没有名),还是要懂其他语言才能深刻认识到
页:
[1]
2