Оператор множественного переключения аргументов - PullRequest
5 голосов
/ 03 мая 2011

Итак, сегодня я сдавал тест по информатике, и мне пришлось написать большое количество последовательных операторов if. У всех них были одни и те же основные аргументы, только условия были разными. Все это заставило меня задуматься, не было ли где-то нескольких операторов аргумента переключения. Вот пример того, о чем я думаю:

int i = 7;

switch(i > 4, i < 10) {
    case T, T:
        return "between 4 and 10";

    case T, F:
        return "greater than 10";

    case F, T:
        return "less than 4";

    case F, F:
        return "your computer's thinking is very odd";
}

В этом случае аргументами являются i > 4 и i > 10, а T и F указывают, является ли аргумент истинным или нет.

Я знаю, что этот пример можно легко сделать другими способами, но я просто пытаюсь показать его использование. А что, если бы было 4 аргумента, это было бы что-то вроде 20, если бы каждый из них требовал повторного ввода условий.

Итак, мой вопрос: есть ли язык, который это делает? Или это планируется для будущего языка? Или существует еще лучший метод?

Ответы [ 6 ]

6 голосов
/ 03 мая 2011

Трудно сказать, что "ни один язык не делает этого", потому что почти наверняка кто-то работает над экспериментальным языком или двумя, которые делают. Однако большинство процедурных языков не имеют такого рода функции.

В вашем примере, я думаю, вы подразумеваете, что T, F и т. Д. Означают «первое выражение оценивается как True , а второе оценивается как False» (то есть , логично А ТАКЖЕ). Это напоминает некоторые языки таблицы решений, где обработка включает в себя поиск первой строки таблицы решений, которая удовлетворена, и выполнение действия этой строки. Кроме этого, я не знаю ни одного языка, на котором есть что-то подобное.

3 голосов
/ 04 мая 2011

In Mathematica :

Switch[{i > 4, i < 10},
  {True, True},   "between 4 and 10",
  {True, False},  "greater than 10",
  {False, True},  "less than 4",
  {False, False}, "your computer's thinking is very odd"
]

Конечно, это печатает, что 4 меньше 4, а 10 больше 10, но это в вашем псевдокоде.

Для этого конкретного случая лучше написать:

Which[
  i < 4,        "less than 4",
  4 <= i <= 10, "between 4 and 10",
  i > 10,       "greater than 10",
  True,         "your computer's thinking is very odd"
]
3 голосов
/ 03 мая 2011

По крайней мере, в языках, которые допускают преобразование из bool в int, вы можете справиться с этим довольно легко. Вы просто конвертируете два логических значения в целочисленное значение с битовой привязкой. Поскольку у вас есть два логических значения, вы можете использовать одно непосредственно как бит 0 вашего результата, а другое, умноженное на два, как второй бит вашего результата.

int i = 7;

int range = (i>4) | (i<10)*2;

switch(range) {
    case 3: return "between 4 and 10";
    case 2: return "greater than 10";
    case 1: return "less than 4";
    case 0: return "your computer's thinking is very odd";
}
1 голос
/ 03 мая 2011

Вы можете использовать почти столько же языков, без какой-либо специальной языковой поддержки.Например, в ruby:

i = 7
case ([i > 4, i < 10])
when [true, true]:
    puts "between 4 and 10"
when [true, false]:
    puts "greater than 10"
...
end

или в groovy:

i = 7
switch([i > 4, i < 10]) {
case [[true, true]]:
    println "between 4 and 10"
    break;
case [[true, false]]:
    println "greater than 10"
    break;
...
}
1 голос
/ 03 мая 2011

в Python:

i = 7

test = (i > 4, i < 10)

print test

if test == (True, True):
    print "between 4 and 10"

elif test == (True, False):
    print "greater than 10"

elif test == (False, True):
    print "less than 4"

elif test == (False, False):
    print "your computer's thinking is very odd"
0 голосов
/ 03 мая 2011

Я согласен с Тедом, конечно, трудно сказать, какие языки могут существовать. Но ваша логика может быть обработана во многих.

Ваш переключатель просто сначала переводит в if (что-то вроде if ((i > 4) && (i < 10)) во многих языках).

Случаи переключения могут быть смоделированы как возвращаемые значения функций, выраженные в некоторой предметной области, опять же, во многих языках, даже в большинстве.

...