hubeiwdlue 发表于 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语言为什么喜欢把变量写在头部,因为那些年的编译器不完善.

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

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-28 18:31:25

hubeiwdlue 发表于 2024-8-28 18:28
你这么说,我大概明白了,lisp函数(/)后面的局部变量,lisp会保护这些变量在函数内是独立的,仅作用在函 ...

没错,你理解了
页: 1 [2]
查看完整版本: 局部变量不能和全局变量重名