明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: baitang36

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

[复制链接]
发表于 2024-8-28 16:17:34 | 显示全部楼层
你有种再说一遍 发表于 2024-8-28 16:06
函数就是运行时候的栈帧,而lisp函数(入参/局部变量)这个局部变量会保护它,相当于把局部变量全部给换了一 ...

就是说,lisp函数,不管局部变量取得变量名是什么,在电脑眼里,就是a/b/c/d,按顺序从新给个标示符?
发表于 2024-8-28 16:33:06 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-8-28 16:37 编辑
hubeiwdlue 发表于 2024-8-28 16:17
就是说,lisp函数,不管局部变量取得变量名是什么,在电脑眼里,就是a/b/c/d,按顺序从新给个标示符?

一般来说,编译后文件只有函数表有名字,而且这个名字是为了FFI给外部调用.
而函数体内,只是一个连续的地址值,
因为编译器把栈帧(函数体)的全部变量都提取在头部,申请内存的时候就可以直接知道这个头部大小.
所以你可以看见,c语言为什么喜欢把变量写在头部,因为那些年的编译器不完善.
发表于 2024-8-28 16:45:36 | 显示全部楼层
你有种再说一遍 发表于 2024-8-28 16:33
一般来说,编译后文件只有函数表有名字,而且这个名字是为了FFI给外部调用.
而函数体内,只是一个连续的地 ...

谢谢惊惊大佬的指点。
发表于 2024-8-28 17:17:41 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-8-28 17:20 编辑
hubeiwdlue 发表于 2024-8-28 16:45
谢谢惊惊大佬的指点。

如果你在lisp函数(/)斜杆后面不写局部变量名,
那么外部同名的全局变量或者函数是可以穿透进来的,失去保护内部变量的功能.
给到人的感觉就是,变量都是全局的,只是函数体写了局部变量消除就会保护和消灭它.


这就是为什么你能(setq 函数 nil)
要把函数也当作是一个全局变量,所以叫这个语言是global,
而不是local的

发表于 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-28 18:31:25 | 显示全部楼层
hubeiwdlue 发表于 2024-8-28 18:28
你这么说,我大概明白了,lisp函数(/)后面的局部变量,lisp会保护这些变量在函数内是独立的,仅作用在函 ...

没错,你理解了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 00:39 , Processed in 0.162978 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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