次のような言語でifステートメントを書くことができたというかすかな記憶があります:
if (foobar == ("this" || "that"))
それ以外の:
if (foobar == "this" || foobar == "that")
後者はより冗長であるため、美的に魅力的ではありません。
前者の規則は主要な言語でサポートされていますか? これが広くサポートされていない理由はありますか?
次のような言語でifステートメントを書くことができたというかすかな記憶があります:
if (foobar == ("this" || "that"))
それ以外の:
if (foobar == "this" || foobar == "that")
後者はより冗長であるため、美的に魅力的ではありません。
前者の規則は主要な言語でサポートされていますか? これが広くサポートされていない理由はありますか?
Iconプログラミング言語にはこの機能があります。
ジェネレーターを使用すると、次のことができます。
if i = (0 | 1) then write("0 or 1")
i = 0 または i = 1 の場合に成功します。次のこともできます。
if (i | j | k) = (0 | 1) then write("0 or 1")
これは、i、j、または k のいずれかが 0 または 1 に等しい場合に成功します。
この背後にある基本的な考え方は、これらの(1|2|3..)
シーケンスのそれぞれがジェネレーターを作成し、値がなくなるまで各値を順番に返すというものです。このようなブール値の状況でジェネレーターを使用すると、比較が成功するまでジェネレーターから値が要求されます。比較の両側で 2 つのジェネレーターを組み合わせると、いずれかが成功するまで可能なすべての組み合わせが試行されます。(値が等しくない場合、false を返す代わりに、等値演算子は「失敗」します。)
パスカルが次のようなin
声明を出したことを思い出すようです。
if x in (foo, bar) then
...
より広くサポートされていない理由については、私を打ち負かします。それはかなり素晴らしい構文糖衣のように思えます。
その構文を使用した覚えがある唯一の場所は、約 25 年前の COBOL です。
広くサポートされていない理由は、コンパイラが解決できないあいまいさにつながるためだと思います。あなたの特定のケースでは、「これ」と「それ」は文字列であり、条件付き OR 演算子は意味がないため、特に問題はありません。しかし、C のような言語で、条件の結果がブール値 0 または 1 になる次のスニペットを考えてみましょう。
int a = 22;
int b = 99;
int rslt = SomeFunction();
if (rslt == (a || b))
この時点で、コンパイラは何が必要かを確実に判断できません。これを意図していますか:
if (rslt == a || rslt == b)
または、次のことを意図していましたか:
if ((rslt == 0 && a == 0 && b == 0) || (rslt == 1 && a == 1 && b == 1))
そのような構文を使用できるタイプを制限できますが、理想的には直交構文であるべきものの上に例外を積み上げています。これはユーザーを混乱させ、コンパイラを複雑にします。
また、代入文とは条件文で異なる式を評価するように強制します。これも間違いなく、コンパイラを複雑にするでしょう。
確かに機能させることができますが、オーバーロードされたシンボルを使用した新しい構文が必要になり、すべて疑わしい利益になると思います.
インタラクティブ フィクション (テキスト アドベンチャー) オーサリング言語Informは、'or' 演算子を使用してそれをサポートしています ('||' と書かれる通常の論理和とは異なります):
if (qty==2 or 3)
print "some";
else
print "many";
これが広くサポートされていない理由はありますか?
これは少し特殊なケースの魔法です。単純な例の式以外で何をするのかは明確ではありません。
if (n or 8==m+(1 or 2) or 7) // plausible
if (qty<4 or 5) // huh?
a= "cat" or "dog" // er
Python やその他の最新のスクリプト言語で利用可能な「if value in (sequence)」表記法は、おそらくこのニッチを今のところ引き継いでいます。
Pythonでは次のように書くことができます
if(foobar in ('this', 'that', 'and something else'))
('this'、'that'、'およびその他')-これはリストタイプです。
したがって、どのoop言語でも、独自のクラスを作成できると思います。
MyClass(object):
List values
def in(value):
return search_value_in_values(value)
次のように記述します。
if(new MyClass('this', 'that', 'and something else').in(foobar))
この||
演算子は、2 つのオペランドを取り、単一の値を返す二項演算子です。ほとんどの主要な言語で式が評価される方法のため、その構文を使用して、値が一連の値のいずれかと等しいかどうかを確認することは不可能です。そのため、ほとんどの主要言語ではサポートされていません。
in
ただし、@1800 INFORMATION が投稿した構文は、多くの言語でサポートされています。お使いの言語でサポートされていない場合は、in()
orという関数を作成してin_array()
、値と配列の 2 つの引数を取りtrue
、配列にその値が含まれている場合に返すことができます。(たとえば、PHP には組み込みのin_array()関数があります。)