Language agnostic 在switch情况下是否缺少大括号语法?

Language agnostic 在switch情况下是否缺少大括号语法?,language-agnostic,programming-languages,syntax,Language Agnostic,Programming Languages,Syntax,虽然我们都熟悉: switch(x){ case 1: do_something(); break; case 2: do_something_else(); break; default: do_default(); break; } 我想知道在任何一种语言中是否存在这样的语法变体: switch(x){ case(1){ do_something(

虽然我们都熟悉:

switch(x){
    case 1:
        do_something();
        break;
    case 2:
        do_something_else();
        break;
    default:
        do_default();
        break;
}
我想知道在任何一种语言中是否存在这样的语法变体:

switch(x){
    case(1){
        do_something();
    }
    case(2){
        do_something_else();
    }
    default{
        do_default();
    }
}

当我写这篇文章时,我意识到没有明确的方法来指示某个案例是非中断的,并且程序流应该级联到后续案例中。很可能这就是原因,但我一直很好奇,为什么我顺便看到的C族语言(我来自PHP)放弃了
switch
construct
case
语句的大括号语法,但是,基于C的语言支持类似的语法,您可以在case语句中创建匿名代码块,如下所示:

switch(x){
  case(1): {
    do_something();
  } break;
  case(2): {
    do_something_else();
  } break;
  default: {
    do_default();
  }
}

如果您想在您的案例中定义变量的范围,这是很好的。当然,您仍然需要
中断
以避免失败。

不是一种类似C的语言,但Perl的语法实际上与您所描述的一样。从文档中:

use feature ":5.10";
given($foo) {
    when (undef) {
        say '$foo is undefined';
    }
    when ("foo") {
        say '$foo is the string "foo"';
    }
    when ([1,3,5,7,9]) {
        say '$foo is an odd digit';
        continue; # Fall through
    }
    when ($_ < 100) {
        say '$foo is numerically less than 100';
    }
    when (\&complicated_check) {
        say 'a complicated check for $foo is true';
    }
    default {
        die q(I don't know what to do with $foo);
    }
}
使用功能“:5.10”;
给定($foo){
何时(未定义){
说“$foo未定义”;
}
何时(“foo”){
说“$foo是字符串“foo”;
}
当([1,3,5,7,9]){
说“$foo是一个奇数”;
继续;#失败
}
当($\小于100){
假设“$foo在数字上小于100”;
}
何时(\&U检查){
说“一张复杂的$foo支票是真的”;
}
违约{
die q(我不知道如何处理$foo);
}
}

在C中,大括号所做的只是定义变量的作用域(代码可以访问这些变量),而不是用于流控制。表明该案失败的唯一明确方法是对其进行评论

switch (a)
{
case 0:
    doSomethingSpecial();
    // Deliberate fall-through
case 1:
    doSomething();
    break;

case 2:
    doSomethingElse();
    break;
}

据我所知,没有一种语言需要大括号作为
开关
/
大小写
语法的一部分。这不一定有什么意义,因为大括号通常会引入“块范围”,这在
case
语句之间通常不起作用

但是,您可能想知道,在某些语言(如C++)中,您可以将大括号作为case语句的一部分(而不是switch/case语法本身的一部分)来引入自己的有界范围:

switch (x) {
  case a:
    {
       ...
       break;
    }
}
<>有时候,C++编译器会要求你这样做,尤其是当你在Case语句中声明变量时。

< P>讨论了开关/CASE构造,并且在下面是模式匹配的函数编程范式规范。p>
引用一句话,“模式匹配可能被视为if-then-else和case语句的更复杂的替代方案。”

在常见的Lisp case构造()中,每个不同的选项都在一个单独的s-expr中处理;不需要“中断”,标签后有一个隐式的
progn
,因此允许使用多种形式

但是没有失败的选择

(case x
    ((1 2 3)   (do-this))
    ((4 5)     (do-that))
    (otherwise (do-something-else)))

Mathematica使用以下开关语法:

Switch[
  x,
  1,   action[1],
  2,   action[2],
  _,   defaultaction[]
]

也就是说,表达式
x
,然后是模式和动作的交替序列。标记
\uuuuuuu
是一个表示任何表达式的模式对象,因此定义了默认值。

在C/C++/Java中,开关分支失效。然而,在C#中,不允许分支通过so,虽然C#switch语法中也没有大括号,但是缺少通过删除任何语法优势——除了可能省略“case terminator”;我记得不久前我在熟悉C#的时候也读过这篇文章。在本例中,虽然不允许使用这种语法,但允许使用这种语法不会有任何缺点。出于好奇(我会在谷歌上搜索一下),为什么C#不允许掉入?我的回答没有帮助吗?这似乎是您描述的语法的一个很好的例子。@Mr.Wizard;很抱歉,确实是这样,但是eldarerathis给出的例子更接近我感兴趣的东西。
switch
的语法偏差一直激发着我对“大括号块”语言的好奇心+1.让我重新关注它;我正在学习
C
,作为一个教育项目,我正在为我正在创建的一种简单脚本语言编写一个解释器。任何信息都是好信息!但那是另一种野兽;没有给出何时要求您显式编写
继续
,以便失败?或者我是倒着说的?@Tomalak:是的,这与大多数C风格的switch语句相反。您必须明确地
继续
,以避免
在给定条件下中断
-ing。在我看来,这似乎与OP所暗示的一样,但是,基于这样一个事实,即他在第二个示例中留下了显式的
break
s,但似乎将它们彼此等同(即,为了使他的第一个示例具有与带大括号的第二个示例相同的流,第二个示例中的每个块都必须具有隐式的
break
).谢谢你,埃尔达拉斯;非常有趣。我一直在被动地选择一种新的语言(从PHP到Perl/Python/Ruby),而其他人则在很大程度上考虑应用程序的因素,Perl有着古怪的结构,我喜欢这种结构。请注意你对我的第二个例子的假设;隐式断裂是由意外设计造成的:P@eldarerathis:那么这个答案与开关箱无关。o。O@Tomalak例如我不太清楚你的意思。问题是“我想知道在任何语言中是否存在这样的语法变体:[code]”,我想表明Perl的语法看起来几乎与他发布的内容相同。
switch
(在C/C++/Java中,而不是在C#中)有一种失败行为,但通常在if-then-else或模式匹配结构中都找不到。它通常还有一个被比较值的限制,这个限制(例如,对于较小的数字)可用于编译器创建直接跳转表