作者scwg ( )
看板PLT
标题Re: [问题] 为什麽local variable的scope不能延及ꐠ…
时间Thu Mar 6 22:30:13 2008
无聊没事, 再来回一篇...
※ 引述《zerodevil (冰心无情)》之铭言:
: 其实如果允许nested function的话
: 拿到上一层function的变数也没什麽不好
:
: function foo() {
: var x = 1;
: function bar() {alert(x)}
: bar();
: }
: 我想应该不用特别解释了
: 这个例子的bar可以看到x然後印出1
:
: bar宣告在foo里面,
: 所以bar在的时候一定有x可以用
: 想在compile time算出x的address也不是什麽问题
是的, Pascal 就是如此
只是如果是用到好几层外的变数有可能要查好几次 base address 就是了
其实 gcc 也可以...
$ cat t.c
#include <stdio.h>
int main(){
int x = 1;
int a(){
int b(){
x = 2;
}
b();
}
a();
printf("%d\n", x);
return 0;
}
$ gcc t.c
$ ./a.out
2
: (如果javascript可以compile的话)
:
: 这样godfat大提到的问题或许可以少一些?
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 140.112.90.68
: ※ 编辑: zerodevil 来自: 140.112.90.68 (03/06 04:21)
: 推 linjack:这应该是比较像 lambda / closure 的概念?不太一样吧._.? 03/06 11:40
: 推 godfat:同意 linjack, 这样是无法无中生上层的 local var 的 03/06 15:11
: → godfat:也就是那有一定的限制在,不能任意操作 local var 03/06 15:12
其实 gcc 的实作和 Pascal 是类似的
(我没细看 gcc -S 的结果, 但是复杂的程度有点像)
而他们有个共通点: 不支援 returning local function
$ cat t.c
#include <stdio.h>
int (*a())();
int c();
int main(){
int (*f)();
int x = 1;
f = a();
c();
x = f();
printf("%d\n", x);
return 0;
}
int (*a())(){
volatile int x = 2;
int b(){
return x;
}
return &b;
}
int c(){
volatile int y = 3;
volatile int z = y + 1;
volatile int w = z + 1;
return w;
}
$ gcc t.c
$ ./a.out
5
如果在 c() 里再加个 volatile int v = w + 1;
甚至会 segmentation fault
但是 javascript, perl 之类的语言都可以做到
这才是 linjack 所说的 closure
大部份的 functional language 也都支援,
而且是 functional programming 时一个重要的工具..
绕回原题...
lisp 从 dynamic scoping 换到 static scoping 时,
因为很多变数忽然「拿不到了」
於是 closure 成了「又拿得到了」的方法 XD
--
All this will not be finished in the first 100 days.
Nor will it be finished in the first 1,000 days,
nor in the life of this Administration,
nor even perhaps in our lifetime on this planet.
But let us begin.
-- John F. Kennedy, Inaugural Address
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.54
1F:推 godfat:gcc 居然有这种 ext @@ 第二段那些看不太懂... 大概是在弄 03/06 22:47
2F:→ godfat:call stack 的东西?所以才需要 volatile, 猜的 03/06 22:47
3F:→ scwg:嗯, 因为不确定会不会被 optimize 掉, 所以加 volatile 03/06 22:55
4F:→ scwg:强制 override memory 03/06 22:55