2009-03-14 4 views
6

mam słabą pamięć jest w stanie napisać if w jakimś języku takiego:W przypadku stwierdzenia

if (foobar == ("this" || "that")) 

zamiast:

if (foobar == "this" || foobar == "that") 

Ten ostatni jest bardziej gadatliwy, a zatem mniej estetycznie do mnie przemawia.

Czy poprzednia konwencja jest obsługiwana w jakimkolwiek ważnym języku? Czy istnieje powód, dla którego nie jest to szeroko obsługiwane?

+0

ty * może * napisać, że w C lub C++ .. po prostu nie robi tego, co ty też chcesz;). –

Odpowiedz

4

Język programowania Icon ma tę funkcję.

Poprzez wykorzystanie generatorów, można zrobić

if i = (0 | 1) then write("0 or 1") 

który powiedzie jeśli i = 0 lub i = 1. Można nawet zrobić:

if (i | j | k) = (0 | 1) then write("0 or 1") 

który powiedzie się, jeśli któryś z I, j, lub k jest równe 0 lub 1.

Podstawową ideą jest to, że każda z tych sekwencji (1|2|3..) tworzy generator, który będzie zwracał każdą z wartości po kolei, aż zabraknie wartości. Gdy użyjesz generatora w takiej samej booleanacji, wartości będą żądane od generatora, dopóki porównanie się nie powiedzie. Kiedy połączysz dwa generatory po obu stronach porównania, wszystkie możliwe kombinacje będą podejmowane, aż się uda. (Zamiast zwrotu false operator równości "zawiedzie", jeśli wartości nie są równe.)

2

wydaje mi przypomnieć Pascal miał oświadczenie in jak w:

if x in (foo, bar) then 
    ... 

Na pytanie dlaczego nie jest szerzej obsługiwane, bije mnie. Wygląda na całkiem niezły kawałek cukru syntaktycznego.

+0

To samo działa również w Pythonie –

+0

Składnia w Pascalu używanych zestawów, które musiały być typu integralnego. Brak wersji Pascala, że ​​jestem świadomy obsługiwanych zestawów ciągów. –

+0

Wygląda na to, że przypominam sobie, że Ada również to popiera, prawdopodobnie nie obsługiwała jednak ciągów. –

2

Jedyne miejsce, które pamiętam, używając tej składni, to COBOL, około 25 lat temu.

Podejrzewam, że powodem, dla którego nie jest on szeroko obsługiwany, jest fakt, że prowadzi to do niejednoznaczności, których kompilator nie może rozwiązać. W twoim konkretnym przypadku nie jest to szczególny problem, ponieważ "this" i "that" są ciągami, dla których operator warunkowy OR nie ma sensu. Ale rozważyć ten fragment, jak w języku C, gdzie efektem warunkowego jest wartość logiczna 0 lub 1:

int a = 22; 
int b = 99; 
int rslt = SomeFunction(); 
if (rslt == (a || b)) 

W tym momencie kompilator nie może wiarygodnie ustalić, co chcesz. Czy zamierzasz w tym:

if (rslt == a || rslt == b) 

lub, czy zamierzają:

if ((rslt == 0 && a == 0 && b == 0) || (rslt == 1 && a == 1 && b == 1)) 

Można ograniczyć rodzaje, dla których mogą być stosowane takie składnia, ale potem masz palowania wyjątki na górze co idealnie powinna być składnią ortogonalną. To będzie dezorientować użytkowników i komplikować kompilator.

Wymusza również wyrażenia, które mają być oceniane inaczej w warunkowych niż w instrukcji przypisania. To też niewątpliwie komplikowałoby komplikacje.

Z pewnością można by go uruchomić, ale myślę, że wymagałoby to nowej składni z przeciążonymi symbolami, a wszystko to dla wątpliwej korzyści.

0

Operator || jest operatorem binarnym, który pobiera dwa operandy i zwraca pojedynczą wartość. Ze względu na sposób oceniania wyrażeń w większości głównych języków, niemożliwe byłoby użycie tej składni do sprawdzenia, czy wartość jest równa jednemu ze zbioru wartości. Dlatego nie jest obsługiwany w większości głównych języków.

Składnia in, którą zamieszczono w @ 1800 INFORMACJE, jest obsługiwana przez wiele języków. Jeśli nie jest obsługiwany w twoim języku, możesz po prostu utworzyć funkcję o nazwie in() lub in_array(), która pobiera dwa argumenty, wartość i tablicę, i zwraca true, jeśli tablica zawiera tę wartość. (PHP, na przykład, ma wbudowaną funkcję in_array()).

1

Język programowania interaktywnego (przygoda tekstowa) Inform obsługuje go za pomocą operatora "lub" (w odróżnieniu od zwykłego logicznego - lub który jest napisany "| | '):

if (qty==2 or 3) 
    print "some"; 
else 
    print "many"; 

Czy istnieje powód, dlaczego nie jest powszechnie obsługiwana?

To trochę magia wyjątkowa; nie jest jasne, co robi w czymkolwiek innym, ale prostym przykładowym wyrażeniu.

if (n or 8==m+(1 or 2) or 7) // plausible 
if (qty<4 or 5) // huh? 
a= "cat" or "dog" // er 

do „jeżeli wartość w sekwencji)” (dostępnej w notacji Python i innych nowoczesnych języków skryptowych prawdopodobnie przejęty tej niszy na dobre.

+0

Logiczne - lub jest napisane "&&"? Sądzę, że masz złe symbole, sir. –

+0

ahem. Masz rację, nawet Inform nie jest tak przewrotny! – bobince

0

W Pythonie można napisać jak to

if(foobar in ('this', 'that', 'and something else')) 

('to', 'że', 'a co innego') - jest to rodzaj listy.

Tak, myślę, że w każdym języku oop można utworzyć własną klasę:

MyClass(object): 

    List values 

    def in(value): 
    return search_value_in_values(value) 

i napisać coś takiego:

if(new MyClass('this', 'that', 'and something else').in(foobar))