Отсутствие синтаксиса скобок в случаях переключения? - PullRequest
2 голосов
/ 05 апреля 2011

В то время как мы все знакомы с:

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();
    }
}

Когда я пишу это, японимать, что не существует clean способа указать, что определенный случай не нарушается, и что поток программы должен каскадно включаться в последующие случаи.Вероятно, это достаточная причина, но мне всегда было любопытно, почему языки семейства C (я пришел из PHP), которые я видел мимоходом, отказались от синтаксиса фигурных скобок для switch construct case операторов.

Ответы [ 7 ]

2 голосов
/ 06 апреля 2011

Не 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);
    }
}
1 голос
/ 06 апреля 2011

Mathematica использует следующий синтаксис переключателя:

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

То есть выражение x, затем чередующаяся последовательность паттерна и действия. Маркер _ является объектом шаблона, представляющим любое выражение, и поэтому определяет значение по умолчанию.

1 голос
/ 06 апреля 2011

Эта ссылка на википедию обсуждает конструкцию switch / case, а непосредственно под ней - спецификация парадигм функционального программирования сопоставления с образцом.

Процитируем: «Сопоставление с образцом может рассматриваться как более сложная альтернатива операторам if-then-else и case».

1 голос
/ 06 апреля 2011

Я не знаю ни одного языка, для которого требуются фигурные скобки как часть синтаксиса switch / case. Это не обязательно имеет большой смысл, так как фигурные скобки обычно вводят «область видимости блока», которая обычно не в игре между case операторами.

Однако вам может быть интересно узнать, что в некоторых языках (например, C ++) вы можете использовать фигурные скобки как часть оператора case (а не как часть самого синтаксиса switch / case) для представьте свою собственную ограниченную область:

switch (x) {
  case a:
    {
       ...
       break;
    }
}

Иногда компилятор C ++ требует, чтобы вы сделали это, особенно когда вы объявляете переменные внутри оператора case.

1 голос
/ 06 апреля 2011

В C все фигурные скобки - это определение области видимости (где они могут быть доступны посредством кода) переменных, она не используется для управления потоком.Единственный надежный способ указать, что провал - это преднамеренное, - прокомментировать это

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

case 2:
    doSomethingElse();
    break;
}
1 голос
/ 06 апреля 2011

Я не знаю ни одного языка, который поддерживает второй метод, который вы иллюстрируете, однако языки на основе C поддерживают аналогичный синтаксис, где вы можете создать блок анонимного кода в вашем выражении case, например:

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

Это хорошо, если вы хотите охватывать переменные в ваших случаях.Конечно, вам все еще нужно break, чтобы избежать провала.

0 голосов
/ 06 апреля 2011

В конструкциях Case Common Lisp ( case, ccase, ecase ) каждая отдельная опция обрабатывается в одном отдельном s-выражении; нет необходимости в "break", и после меток есть неявное progn, поэтому допускается несколько форм.

Тем не менее, нет альтернативы ...

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