可能没有任何编程语言在其正式定义中支持重叠作用域。虽然从技术上讲是可能的,但这会使实现比必要的更加复杂。它还会使语言模糊不清,无法确定什么是有效的,而很可能是一个错误。
我现在能想到的唯一实际用途是它输入更少,写起来更直观,就像在标记中写属性感觉更直观,而不需要引号,如
<foo id=45 />
而不是
<foo id="45" />
。
我认为强制嵌套结构也可以使处理更有效率。通过强制嵌套结构,解析器可以将节点推入和弹出单个堆栈,以跟踪打开节点的列表。对于重叠的范围,您需要一个有序的打开范围列表,每当遇到
begin-new-scope标记时都需要添加到该列表中,然后每次遇到
end-scope标记时扫描该列表,以查看最可能关闭的打开范围是哪个。
尽管没有编程语言支持重叠作用域,但有 HTML 解析器支持它作为其错误恢复算法的一部分,包括所有主要浏览器中的解析器。
此外,
C中的
switch
语句允许类似于重叠作用域的结构,例如
Duff's Device。
switch(count%8)
{
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n>0);
}
因此,理论上,编程语言可以具有类似于范围的语义,以允许在需要时进行这些技巧来进行优化,但可读性会非常低。
goto
语句以及某些语言中的
break
和
continue
也可以让您将程序结构化,使其表现得像重叠的作用域。
BOLD: while (bold)
{ styles.add(bold)
print "BOLD"
while(italic)
{ styles.add(italic)
print "BOTH";
break BOLD;
}
}
italic-continued:
styles.remove(bold)
print "ITALIC"