De lo que estás hablando es de menos sintaxis que estructura . Realmente solo podría tener una whendeclaración como esa en un sistema que ejecute una cantidad finita de lógica, luego ejecute las whendeclaraciones, luego repita y ejecute la lógica nuevamente, continuando en un bucle infinito.
Por ejemplo, la programación de Windows suele estar "basada en eventos". Suscribirse al Clickevento de un botón significa esencialmente "hacer esto cuando se hace clic". Sin embargo, lo que sucede debajo del capó es un bucle de procesamiento de mensajes. Windows envía un mensaje a la aplicación cuando el usuario hace clic en el botón y el bucle de procesamiento de mensajes en la aplicación ejecuta el controlador de eventos apropiado.
Si usa eventos en, por ejemplo, C #, puede hacerlo sin un bucle de mensajes, pero la limitación es que tiene que declarar el evento con anticipación, por lo que no puede escribir una whendeclaración de biblioteca que vigile cualquier tipo de estado. Tienes que esperar un evento específico.
Para obtener este comportamiento en una arquitectura de Von Neumann, debe ejecutar algún tipo de bucle infinito que verifique todas las condiciones cada vez a través del bucle que ejecuta el código apropiado, si corresponde. Internamente solo obtienes una gran lista de if/ theno switchdeclaraciones. La mayoría de los programadores web y de aplicaciones de escritorio vomitarían si vieran tal construcción, por lo que en realidad solo es aceptable si lo envuelves en algún tipo de azúcar sintáctica como el modelo de evento de Windows (aunque eso es lo que está sucediendo).
Por otro lado, si observa el campo del desarrollo de firmware incorporado, los ejecutivos en tiempo real o los controladores industriales, este modelo de programación es muy común. Por ejemplo, si tiene un programa en tiempo real, es posible que desee expresar:
outputA = input1 && input2
El código es fácil de entender (porque es declarativo). Sin embargo, para que funcione, debe ejecutarlo en un ciclo cerrado. Reevalúa outputAcada vez a través del ciclo. A muchos programadores de escritorio o web no les gustaría esto porque es ineficiente. Para ellos, el único momento en que debe volver a evaluar outputAes cuándo input1o input2cambios. Prefieren ver algo más como lo que estás describiendo:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Ahora bien, si esto es lo que quieres (y personalmente no prefiero esta idea), y tu objetivo es la eficiencia, entonces todavía tienes que preguntarte qué está haciendo el procesador bajo el capó. Obviamente, todavía hay algún tipo de ciclo en ejecución que compara los estados de entrada con los estados de entrada anteriores cada vez, y ejecuta el código apropiado cada vez que uno cambia. Entonces, realmente es menos eficiente y es más difícil de leer y más difícil de mantener.
Por otro lado, si el trabajo que tiene que hacer cuando los input1cambios son significativos, entonces su whencláusula podría tener sentido. En los PLC, este tipo de instrucción se denomina "detección de flanco ascendente". Guarda el estado de input1la última vez a través del bucle, lo compara con el valor esta vez y ejecuta la lógica si el último estado fue falso y este estado es verdadero.
Si no tienes una arquitectura de Von Neumann, entonces el juego cambia. Por ejemplo, si estás programando un FPGA en VHDL , cuando escribes:
outputA = input1 && input2
(... o lo que sea la sintaxis VHDL apropiada sería), entonces la FPGA realidad se cablea tal que input1y input2están conectados a la entrada de una puerta AND, y la salida de la puerta AND está conectada a outputA. Por lo tanto, el código no solo es fácil de entender, sino que también se ejecuta en paralelo con todas las demás lógicas y es eficiente.
Cuando habla de un controlador industrial como un PLC o PAC, programado en uno de los cinco idiomas IEC-61131-3, el caso típico es este tipo de disposición:
- Leer entradas y almacenar en memoria
- Ejecutar programa principal
- Escribir salidas de memoria a salidas reales
- Ir al paso 1
Esto está integrado en la arquitectura del sistema, por lo que se espera que solo escriba:
outputA = input1 && input2
... y se ejecutará en un bucle continuo.
También hay rutinas de interrupción en estas máquinas. Estos son más como soporte de nivel de hardware para el whenoperador del que estás hablando. La interrupción de hardware es un medio de ejecutar algún código en un evento externo. Por ejemplo, cuando una tarjeta de red dice que tiene datos en espera, el procesador normalmente tiene que leer esos datos inmediatamente o se quedará sin espacio en el búfer. Sin embargo, por la cantidad de veces que necesita conectar una interrupción de hardware real, dudo que valga la pena incluir una palabra clave de idioma. Estaría limitado a pines de entrada de CPU, y parece que desea probar el estado interno del programa.
Entonces, en un lenguaje tradicional (sin un ciclo cerrado que se ejecuta infinitamente), debe hacer la pregunta, "¿cuándo se ejecuta el código de evaluación"?
Si tú escribes:
when A do
launchNukes()
... y suponiendo que Aes una expresión booleana arbitraria, ¿cómo sabe cuándo volver a evaluar esa expresión? Una implementación ingenua significaría que debe volver a evaluarla después de cada escritura de memoria. Puede pensar que puede reducirlo, pero considere esto:
when systemTime > actionTime do
launchNukes()
Tenga en cuenta que systemTimesiempre está cambiando (cada vez que lo lea, obtendrá un número diferente). Esto significa que la parte condicional de todas sus whencláusulas debe ser reevaluada continuamente. Eso es casi imposible (¡y solo considera por un segundo lo que sucede si tu expresión condicional tiene efectos secundarios!)
Conclusión
Solo puede tener una whendeclaración (como la que está describiendo) en una arquitectura basada en un bucle infinito que ejecuta el programa principal, luego ejecuta las whendeclaraciones si las condiciones pasaron de falso a verdadero en este bucle. Si bien esta arquitectura es común en dispositivos integrados e industriales, no es común en lenguajes de programación de uso general.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from .... También: msdn.microsoft.com/en-us/library/dd233249.aspx Básicamente, haría una búsqueda de "cuando" usando la búsqueda de código de Google.