我正在使用TypeScript编写编译器,目前的重点是如何将“词法范围”传递给相关对象。实际上,每当代码中有一个概念性的主要分支时,就会创建一个新的词法范围,并将其分配给该AST节点,并将父变量指向其父节点。
module scope
class scope
function scope
function scope # say we have nested functions
conditional-branch scope
conditional-branch scope
...
但我想知道,通常情况下,
我注意到一些语言,如C、C++、Java、Perl和.NET Visual都有“块”作用域,这意味着变量将只定义在它所声明的特定代码块中。
例如,
(C++):
if (true) {
int x = 1;
}
std::cout << x << std::endl;
此代码将无法编译,因为x仅在if语句创建的块作用域中可见。
错误:“X”未在此范围内声明
但是,像VBA、Python和Javascript这样的语言都有“基于函数”的作用域,这意味着创建新范围的唯一时间是定义新函数时。
例如,
(VBA):
If True Then
Dim x As
为什么在Java中花括号没有定义单独的局部作用域?我原以为这是主要花括号语言(C、C++、Java、C#)的共同特性。
class LocalScopeTester
{
public static void main(String... args)
{
Dog mine = new Dog("fido");
if (mine.getName().equals("ace"))
{
Dog mine = new Dog("spot"); // error: dup
出于好奇:如果我有嵌套的作用域,就像下面的示例C++代码一样
using namespace std;
int v = 1; // global
int main (void)
{
int v = 2; // local
{
int v = 3; // within subscope
cout << "subscope: " << v << endl;
// cout << "local: " << v << endl;
我看到在作用域内定义变量是可能的,但是在该作用域之外引用它。例如,下面的代码可以工作:
if condition:
x = 5
else:
x = 10
print x
然而,这让我觉得有点奇怪。如果您尝试在C中执行此操作,变量X的作用域将不正确:
if(condition) { int x = 5; }
else { int x = 10; }
print x; // Doesn't work: x is unavailable!
无论如何,在C中的解决方案是首先声明X,然后弄清楚如何处理它:
int x;
if(condition) { x = 5; }
else
在使用JavaScript MVC创建ASP.NET时,我注意到了几个作用域警告,并意识到在理解开关/ case语句中的变量范围时,我遗漏了一些东西。
警告:“i”已经定义为,指的是案例b和案例c
我的代码看起来类似于以下内容:
switch(element) {
case 'a':
for(var i=0; i < count; i++){
do something
}
break;
case 'b':
for(var i=0; i < count; i++){
do something
}
我对TCL的变量作用域规则感到困惑,下面是一个实验:
if {2 > 1} {
set x 100
}
proc p1 {} {
set y 200
}
puts $x
p1
puts $y
运行该脚本会得到以下结果:
100
can't read "y": no such variable
while executing
"puts $y"
这让我感到困惑:关于$y的错误是有意义的,因为y是在proc内部定义的,所以它不能在proc之外访问。问题是x,为什么它是可访问的?它是在"if“命令的嵌套脚本中定义的。
从我
从技术上讲,我在vim中使用来查看文件的标签,但这个问题通常应该适用于丰富的ctag,v5.8。
假设我有以下python文件,将其命名为foo.py
class foo:
def bar(baz):
print(baz)
让我们在它上面运行ctags:ctags foo.py。生成的tags文件如下所示:
!_ some ctags version / formatting stuff not worth pasting
bar foo.py /^ def bar(baz):$/;" m class:foo
foo foo.py /^class
我正在开发一个c++程序,它本质上只是执行一个lua脚本。然而,在lua脚本中构造类,这些类已经从我的c++程序导出到lua脚本。
我的main() c++函数只是在做了一些准备之后才调用...
luabind::call_function<void>(m_L, "main");
现在我的lua脚本看起来像这样
local function test()
local c = C()
end
function main()
for i=1,2 do
log(i)
test()
end
end
我在C的析构函数中
我正在用OCaml编写一个业余爱好的可重定向C编译器,我正在自下而上地构建它。到目前为止,我有一个带注释的AST类型,简称:
type 'e expr =
| Int of 'e * int
| Var of 'e * var
| Neg of 'e * 'e expr
| Add of 'e * 'e expr * 'e expr
| Sub of 'e * 'e expr * 'e expr
和一个三地址代码类型(再次删减):
type node = Copy o