2009-03-14 12 views
6

Tengo un vago recuerdo de ser capaz de escribir una sentencia if en algún lenguaje de esta manera:Si los estados

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

En lugar de:

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

Este último es más prolija, y por lo tanto menos estéticamente atractivo para mí.

¿La antigua convención es compatible con cualquiera de los principales idiomas? ¿Hay alguna razón por la cual esto no es ampliamente compatible?

+0

que * puede * escribir que en C o C++ .. . simplemente no hace lo que quieres también;). –

Respuesta

4

El lenguaje de programación Icon tiene esta función.

A través del uso de generadores, que puede hacer

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

que sucede si i = 0 o i = 1. Usted puede incluso hacer:

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

que sucede si alguno de i, j, o k es igual a 0 o 1.

La idea básica detrás de esto es que cada una de esas secuencias (1|2|3..) crea un generador que devolverá cada uno de los valores sucesivamente hasta que se quede sin valores. Cuando utiliza un generador en una situación booleana como esta, se solicitarán valores del generador hasta que la comparación tenga éxito. Cuando combine dos generadores a cada lado de la comparación, se intentarán todas las combinaciones posibles hasta que tenga éxito. (En lugar de devolver falso, el operador de igualdad "falla" si los valores no son iguales.)

2

Me parece recordar Pascal tenía una declaración in como en:

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

cuanto a por qué no se admite más ampliamente, me pega. Parece una muy buena pieza de azúcar sintáctica.

+0

Lo mismo funciona también en Python –

+0

La sintaxis en Pascal utilizaba conjuntos, que tenían que ser de tipo integral. Ninguna versión de Pascal de la que tengo conocimiento admite conjuntos de cadenas. –

+0

Parece que recuerdo que Ada también soporta esto, aunque probablemente no manejó cadenas. –

2

El único lugar que recuerdo usar esa sintaxis es en COBOL, hace unos 25 años.

Sospecho que la razón por la que no es ampliamente compatible es porque conduce a ambigüedades que el compilador no puede resolver. En su caso específico, no es un problema particular porque "this" y "that" son cadenas, para lo cual el operador OR condicional no tiene sentido. Pero tenga en cuenta este fragmento, en un lenguaje como C, donde el resultado de un condicional es un valor booleano 0 o 1:

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

En este punto, el compilador no puede determinar con seguridad lo que quiere. ¿Tiene intención de esto:

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

o, ¿tenía intención:

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

Se podría limitar los tipos para los que podría ser utilizado como la sintaxis, pero entonces estás amontonando excepciones en la parte superior de lo que idealmente debería ser una sintaxis ortogonal. Eso va a confundir a los usuarios y complicar el compilador.

También obliga a que las expresiones se evalúen de forma diferente en condicionales que en sentencias de asignación. Eso, también, indudablemente complicaría el compilador.

Sin duda se podría hacer que funcione, pero creo que requeriría una nueva sintaxis con símbolos sobrecargados, y todo por una ganancia cuestionable.

0

El operador || es un operador binario que toma dos operandos y devuelve un solo valor. Debido a la forma en que se evalúan las expresiones en la mayoría de los idiomas principales, sería imposible usar esa sintaxis para verificar si un valor es igual a uno de un conjunto de valores. Es por eso que no es compatible con la mayoría de los idiomas principales.

La sintaxis in que @ 1800 INFORMACIÓN publicada, sin embargo, es compatible con muchos idiomas. Si no es compatible con su idioma, puede crear una función llamada in() o in_array() que toma dos argumentos, un valor y una matriz, y devuelve true si la matriz contiene ese valor. (PHP, por ejemplo, tiene una función incorporada in_array()).

1

El lenguaje de creación de ficción interactiva (aventura de texto) Inform lo admite utilizando el operador 'o' (distinto del habitual lógico o que se escribe '| | '):

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

¿existe una razón por la cual esto no es apoyado ampliamente?

Es un poco especial-caso-mágico; no está claro lo que hace en otra cosa que no sea la simple expresión de ejemplo.

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

El ‘si el valor de (secuencia)’ notación disponible en Python y otros lenguajes de programación modernos, probablemente ha hecho cargo de este nicho para bien ahora.

+0

Lógico, o está escrito '&&'? Me parece que tiene sus símbolos equivocados, señor. –

+0

ahem. Tienes razón, ¡incluso Informar no es tan perverso! – bobince

0

En Python se puede escribir como esto

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

('esto', 'eso' 'y algo más') - es un tipo de lista.

Por lo tanto, creo que en cualquier lenguaje de programación orientada a objetos puede crear su propia clase:

MyClass(object): 

    List values 

    def in(value): 
    return search_value_in_values(value) 

y escribir algo como esto:

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