5

Así que hoy estaba tomando una prueba de informática, y tuve que escribir una gran cantidad de declaraciones if consecutivas. Todos tenían los mismos argumentos básicos, solo que las condiciones eran diferentes. Todo esto me hizo preguntarme si en algún lugar había una declaración de cambio de argumento múltiple. Un ejemplo de lo que estoy pensando es la siguiente:Declaración de cambio de argumento múltiple

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"; 
} 

En este caso, los argumentos son i > 4 y i > 10 y el T y F son si el argumento es verdadero o no.

Sé que este ejemplo se puede hacer fácilmente de otras maneras, pero solo estoy tratando de mostrar su uso. Y qué pasa si hay 4 argumentos, eso sería algo así como 20 si las declaraciones requieren que vuelvas a escribir las condiciones.

Entonces mi pregunta es, ¿hay algún lenguaje que haga esto? ¿O está planeado para un lenguaje futuro? ¿O existe un método aún mejor?

Respuesta

5

Es difícil decir que "ningún idioma hace esto" porque seguramente hay alguien trabajando en un idioma experimental o dos que sí lo tiene. Sin embargo, la mayoría de los lenguajes de procedimiento no tienen este tipo de característica.

En su ejemplo, creo que te refieres a la T, F, etc., para significar "la primera expresión se evalúa como True y la segunda evalúa como False" (es decir, el , es lógico). Esto es una reminiscencia de algunos lenguajes de tablas de decisión, donde el procesamiento implica encontrar la primera fila de una tabla de decisiones que se cumple y ejecutar la acción de esa fila. Aparte de eso, no conozco ningún idioma que tenga algo como esto.

+0

experimental, como Python (tuplas). –

+1

Python no tiene interruptor. Sin embargo, la coincidencia de patrones en varios lenguajes funcionales debería ser muy similar (al menos Haskell permite 'case (p, q) of (True, True) -> x ...'). – delnan

+0

Sí, tienes razón, solo una estructura if-elif-else que es equivalente. Supongo que hay otros que admiten tuplas en las instrucciones switch y if. –

0

Estoy de acuerdo con Ted, por supuesto, es difícil decir qué idiomas pueden existir. Pero tu lógica puede manejarse en muchos.

Su interruptor simplemente traduce primero a un if (algo así como if ((i > 4) && (i < 10)) en muchos idiomas).

Las cajas de los conmutadores podrían modelarse como valores de retorno de función, expresados ​​de alguna forma específica de dominio, nuevamente, en muchos idiomas, incluso en la mayoría.

1

en 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" 
1

se puede hacer casi exactamente esta cantidad de idiomas ya, sin ningún tipo de apoyo especial lenguaje. Por ejemplo, en rubí:

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

O en el maravilloso:

i = 7 
switch([i > 4, i < 10]) { 
case [[true, true]]: 
    println "between 4 and 10" 
    break; 
case [[true, false]]: 
    println "greater than 10" 
    break; 
... 
} 
3

Al menos en los idiomas que permiten la conversión de bool a int, puede manejar esto con bastante facilidad. Básicamente, simplemente convierte los dos booleanos en un valor entero de mapa de bits. Como tiene dos booleanos, puede usar uno directamente como el bit 0 de su resultado, y el otro multiplicado por dos como el segundo bit de su resultado.

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"; 
} 
+0

Creo que entiendo cómo lo estás haciendo, pero ¿cómo harías algo así como 4 argumentos? Porque si multiplicas cada valor en el patrón que usaste, ¿no se superpondrían los resultados, dejando una posibilidad de inexactitud? – Jon

+0

@Jon: solo usa potencias sucesivas de dos, entonces: 'cond1 * 1 | cond2 * 2 | cond3 * 4 | cond4 * 8'. Tal vez fraseándolo como: 'cond1 | cond2 << 1 | cond3 << 2 | cond4 << 3; 'lo haría más claro. –

+0

Bien, pensé que estabas multiplicando en lugar de potenciar. Gracias por la aclaración. – Jon

3

En 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" 
] 

Por supuesto, esto imprime que 4 es menor que 4, y 10 es mayor que 10, pero que está en su pseudocódigo.

Para este caso específico uno podría escribir mejor:

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" 
] 
+1

+1 Sí, 'Which' es especialmente útil para combinar múltiples criterios que no se han combinado en una única dimensión. – DavidC

Cuestiones relacionadas