2009-03-14 18 views
6

ho un vago ricordo di essere in grado di scrivere un'istruzione if in qualche linguaggio come questo:Se dichiarazioni

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

Invece di:

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

Quest'ultimo è più prolisso, e quindi meno esteticamente attraente per me.

La precedente convenzione è supportata in tutte le principali lingue? C'è una ragione per cui questo non è ampiamente supportato?

+0

si * può * scrivere che in C o C++ .. . semplicemente non fa quello che vuoi anche tu;). –

risposta

4

Il linguaggio di programmazione Icon ha questa funzione.

Attraverso l'uso di generatori, si può fare

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

che riesce se i = 0 o i = 1. Si può anche fare:

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

che succede se uno di I, j, o k è uguale a 0 o 1.

L'idea di base è che ognuna di quelle sequenze (1|2|3..) crea un generatore che restituirà ciascuno dei valori a sua volta finché non esaurisce i valori. Quando si utilizza un generatore in una situazione booleana come questa, i valori verranno richiesti dal generatore fino al completamento del confronto. Quando si combinano due generatori su entrambi i lati del confronto, tutte le possibili combinazioni verranno tentate fino a quando non si riesce. (Invece di restituire false, l'operatore di uguaglianza "fallisce" se i valori non sono uguali.)

2

Mi sembra di ricordare Pascal ha avuto un in economico come in:

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

Quanto al motivo per cui non è più ampiamente supportato, mi batte. Sembra un bel pezzo di zucchero sintattico.

+0

La stessa cosa funziona anche in Python –

+0

La sintassi in Pascal utilizzava set, che dovevano essere di tipo integrale. Nessuna versione di Pascal che io sappia degli insiemi di stringhe supportati. –

+0

Mi sembra di ricordare che Ada supporta anche questo, ma probabilmente non ha gestito le stringhe. –

2

L'unico posto che ricordo usando questa sintassi è in COBOL, circa 25 anni fa.

Sospetto che il motivo per cui non è ampiamente supportato è perché causa ambiguità che il compilatore non è in grado di risolvere. Nel tuo caso specifico, non è un problema particolare perché "questo" e "quello" sono stringhe, per le quali l'operatore OR condizionale non ha senso. Ma considerare questo frammento, in un linguaggio come C, in cui il risultato di un condizionale è un valore booleano 0 o 1:

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

A questo punto il compilatore non può determinare in modo affidabile ciò che si vuole. Avete intenzione questo:

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

o, hai intenzione:

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

Si potrebbe limitare i tipi per i quali potrebbe essere utilizzato come la sintassi, ma poi si sta accumulando eccezioni sulla parte superiore di quello che idealmente dovrebbe essere una sintassi ortogonale. Questo confonderà gli utenti e complicherà il compilatore.

Inoltre, impone che le espressioni vengano valutate in modo diverso in condizionali che in istruzioni di assegnazione. Anche questo complicherebbe senza dubbio il compilatore.

Potrebbe essere fatto funzionare, ma penso che richiederebbe una nuova sintassi con simboli sovraccaricati, e tutto per un guadagno discutibile.

0

L'operatore || è un operatore binario che accetta due operandi e restituisce un valore singolo. A causa del modo in cui le espressioni vengono valutate nella maggior parte dei linguaggi principali, sarebbe impossibile utilizzare tale sintassi per verificare se un valore è uguale a uno di un insieme di valori. Ecco perché non è supportato nella maggior parte delle lingue principali.

La sintassi in che @ 1800 INFORMAZIONI pubblicate, tuttavia, è supportata da molte lingue. Se non è supportato nella tua lingua, puoi semplicemente creare una funzione chiamata in() o in_array() che accetta due argomenti, un valore e una matrice e restituisce true se la matrice contiene quel valore. (PHP, ad esempio, ha una funzione integrata in_array().)

1

Il linguaggio di authoring interattivo (testo avventura) Inform supporta l'utilizzo dell'operatore 'o' (distinto dal solito logico o che è scritto '| | '):

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

c'è un motivo per cui questo non è ampiamente supportato?

È un po 'magico; non è chiaro cosa faccia in qualsiasi altra cosa tranne la semplice espressione di esempio.

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

Il ‘se il valore in (sequenza)’ notazione disponibile in Python e altri linguaggi di scripting moderne ha probabilmente assunto questa nicchia per una buona ora.

+0

Logico o è scritto "&&"? Mi pare che tu abbia sbagliato i tuoi simboli, signore. –

+0

ahem. Hai ragione, anche Inform non è perverso! – bobince

0

In Python si può scrivere come questo

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

('questo', 'quello', 'e qualcos'altro') - si tratta di un tipo di elenco.

Quindi, penso che in qualsiasi linguaggio OOP è possibile creare la propria classe:

MyClass(object): 

    List values 

    def in(value): 
    return search_value_in_values(value) 

e scrivere qualcosa del genere:

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