¿Existe un idioma o una función de idioma que pueda manejar casos "cuando"? Es decir, cada vez que se cumple alguna condición, en cualquier ámbito o contexto, ¿se podría especificar que se ejecute código adicional?
Tenga en cuenta que esto es diferente de un simple if
, que debe estar en un ámbito particular y escrito explícitamente. Esta cláusula when casi sería como la if
que se aplica a todos los casos en la ejecución del programa posterior.
programming-languages
Macneil
fuente
fuente
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.Respuestas:
Su pregunta no está clara, pero el patrón de Observador parece ser lo que está buscando http://en.wikipedia.org/wiki/Observer_pattern
fuente
En cuanto a la sintaxis, muchos idiomas tienen una
when
palabra clave, pero no conozco ningún idioma que la use de la manera que usted describe.El patrón 'cuando ocurre X, hacer Y' es una especie de núcleo de la programación orientada a aspectos: en lugar de definir un flujo lineal, conecta los controladores en ciertas condiciones (también conocido como 'suscribirse' a un 'evento'). Este tipo de programación es popular en aplicaciones GUI, donde la rutina central del programa es un despachador de eventos.
Algunos idiomas tienen amplias características de sintaxis para proporcionar tales mecanismos a través de construcciones de lenguaje; un ejemplo sería C # con sus delegados y eventos:
Otros lenguajes utilizan construcciones OOP (patrón de observador, oyentes de eventos, etc., un ejemplo en Java (mi Java está un poco oxidado, así que siéntase libre de editar):
Sin embargo, otro enfoque es utilizar las antiguas devoluciones de llamada. Ejemplo en javascript:
fuente
Nadie ha mencionado aún el COMEFROM de INTERCAL :
fuente
El lenguaje Tcl tiene trazas en las variables que permiten ejecutar código arbitrario cada vez que se establece una variable (o lectura o eliminación, pero eso es menos importante aquí). Ese código arbitrario puede incluir fácilmente la evaluación de una expresión y la ejecución de algún código si es válido. La restricción principal es que si bien puede hacer esto para las variables locales, generalmente no es muy útil porque tienden a tener una vida útil muy corta, por lo que estas cosas generalmente están restringidas a variables globales y de espacio de nombres. (Tcl no tiene cierres).
Pero si estás haciendo esto, debes tener cuidado. Si bien oficialmente no tiene problemas con la reentrada (el seguimiento está deshabilitado durante la ejecución del cuerpo) sigue siendo una excelente manera de escribir código muy poco claro y causar mucha confusión. También es una idea realmente terrible usarlo con una variable de bucle (que no sea para la depuración) ya que el impacto en el rendimiento puede ser bastante significativo.
Se ilustra un ejemplo (basado en el código de la página del manual vinculada anterior).
A partir de ese momento, cada vez que
$foo
o se$bar
convierte en un nuevo número entero, se$foobar
convierte en el producto de los dos. Automáticamente.Tcl también permite configurar el código para que se ejecute en otros tipos de disparadores, como la ejecución de comandos, la eliminación de comandos, temporizadores, la disponibilidad de datos en sockets, etc. Con la biblioteca Tk agregada, esto se expande para incluir un conjunto completo grande de eventos GUI también. Es cierto que Tcl es en realidad un lenguaje muy orientado a eventos (incluso si puede escribir fácilmente código que nunca usa ninguna de esas características).
fuente
Algo como el manejo de eventos?
en lugar de func () maneja el evento
dices cuando el evento funciona
¿O tal vez una devolución de llamada en una variable en particular?
fuente
Sí, existe una palabra clave en Perl, como un modificador de declaración:
También es parte de la declaración de cambio:
fuente
switch
declaración para mí. (Con perillas de latón, pero de nuevo es Perl ...)case
en unaswitch
declaración. Justo como en Ada.¿Cuenta esto (
COMEFROM
declaración descrita en Wikipedia) ?Resumen:
fuente
¿Está buscando un lenguaje con una declaración when síncrona o asíncrona?
Suena como un patrón de evento (/ suscripción / devolución de llamada) para mí.
P.ej
Siempre que el propietario de la condición notifique que la condición ha tenido lugar, el oyente hará WhenCondition ().
Podría usar un patrón de enlace con un convertidor que verifique el estado de varias variables de entrada (en el cambio) y calcule la condición, luego haga que una propiedad de entrada del oyente se vincule a la salida y actúe cuando se cambie esa entrada.
En cuanto a los lenguajes, .NET, por ejemplo (es decir, C #) ha incorporado suscripciones síncronas (eventos) y sus Extensiones Reactivas (RX) agrega suscripciones asíncronas.
fuente
La descripción suena como un disparador de base de datos que está diseñado para esperar un escenario determinado y luego ejecutarse.
De Wikipedia:
http://en.wikipedia.org/wiki/Database_trigger
fuente
De lo que estás hablando es de menos sintaxis que estructura . Realmente solo podría tener una
when
declaración como esa en un sistema que ejecute una cantidad finita de lógica, luego ejecute laswhen
declaraciones, 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
Click
evento 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
when
declaració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
/then
oswitch
declaraciones. 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:
El código es fácil de entender (porque es declarativo). Sin embargo, para que funcione, debe ejecutarlo en un ciclo cerrado. Reevalúa
outputA
cada 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 evaluaroutputA
es cuándoinput1
oinput2
cambios. Prefieren ver algo más como lo que estás describiendo: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
input1
cambios son significativos, entonces suwhen
cláusula podría tener sentido. En los PLC, este tipo de instrucción se denomina "detección de flanco ascendente". Guarda el estado deinput1
la ú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:
(... o lo que sea la sintaxis VHDL apropiada sería), entonces la FPGA realidad se cablea tal que
input1
yinput2
están conectados a la entrada de una puerta AND, y la salida de la puerta AND está conectada aoutputA
. 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:
Esto está integrado en la arquitectura del sistema, por lo que se espera que solo escriba:
... 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
when
operador 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:
... y suponiendo que
A
es 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:Tenga en cuenta que
systemTime
siempre está cambiando (cada vez que lo lea, obtendrá un número diferente). Esto significa que la parte condicional de todas suswhen
clá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
when
declaración (como la que está describiendo) en una arquitectura basada en un bucle infinito que ejecuta el programa principal, luego ejecuta laswhen
declaraciones 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.fuente
El lenguaje AspectJ tiene un modelo de punto de unión, que es una solución para manejar exactamente este tipo de situación.
Un punto de unión en AspectJ es un evento dinámico en un programa Java que ocurre cuando el programa se está ejecutando. Los puntos de unión de ejemplo son: (1) Se llama a un método; (2) Se ejecuta un método; (3) Se llama un constructor; (4) Se ejecuta un constructor; (5) Se establece un campo; o (6) Se accede a un campo.
Luego puede crear conjuntos de estos puntos de unión, llamados puntos de corte. Los recortes de puntos se pueden unir, complementar e intersectar de la forma habitual de la teoría de conjuntos. Otros puntos de corte pueden estar condicionados a los valores / tipos de variables (por ejemplo, "solo cuando x es positivo", "solo cuando el valor que se establece es una subclase de este tipo") y en función del estado del programa ("cuando se llama a este método, pero solo cuando este otro método está en la pila de este hilo [lo que significa que ese método lo llamó indirectamente] ").
Una vez que tenga todos estos puntos de corte que describan eventos en el programa, puede usar AspectJ para informar estos eventos. Puede elegir hacer algo antes de que ocurra el evento (
before
consejo), después de que ocurra el evento (after
consejo) o en lugar de que ocurra el evento (around
consejo).Around
El consejo es particularmente útil para agregar almacenamiento en caché a sus programas: cuando se ejecuta algún método, busque en una tabla para ver si ya se realizó el mismo cálculo y, de ser así, use la versión en caché. Con AspectJ, es tan ligero y expresivo que puede hacer tales experimentos de almacenamiento en caché en cientos de puntos diferentes en su código para encontrar si el almacenamiento en caché agrega valores.Muchas personas fuera de la programación orientada a aspectos creen que AOP se trata principalmente de "registro". Puede usar AspectJ para manejar el registro, y lo hace bastante bien ("registre en este archivo de registro cuándo se invocan todos los métodos públicos en este paquete y cuáles fueron sus resultados / resultados de error"). Pero hay mucho más en AspectJ, incluido un truco inteligente para simular el alcance dinámico llamado Patrón de agujeros de gusano [ver diapositiva 23 y siguientes].
Fuera de AOP, también está hablando de programación basada en eventos, que incluye [como otros han notado] el Patrón de Observador. La diferencia entre las soluciones es: (1) cómo se detecta la condición; (2) donde se expresa la condición; y (3) cómo el código de ejecución está vinculado al evento.
fuente
Cómo usar Notify / Wait parece estar cerca de esto:
Dependiendo del contexto, hay algunas estructuras que pueden estar cerca de esto, pero realmente tiene que aclarar su pregunta.
También hay una declaración "when" en XSLT :
El XSLT "cuándo" es una declaración condicional, más como un interruptor que como un if. Sin embargo, el contexto de lo que se entiende por un "cuándo" en la pregunta inicial no estaba realmente bien aclarado.
Utilizo XSLT con bastante frecuencia en Sitecore CMS, donde trabajo para presentar contenido para que pueda usarse en un entorno GUI en algunos casos.
fuente
if
, a pesar de que no es el tipo de procedimientoif
que encontraría en los lenguajes de programación. (Veo XSLT más como un lenguaje de procesamiento de datos específico más que como un lenguaje de programación común; no te veo construyendo una GUI de escritorio usando XSLT)Lo que está pidiendo se llama Programación Reactiva .
Es un paradigma de programación donde las variables son conscientes de la expresión que se les ha asignado y cada vez que cambia un componente de la expresión, la variable reacciona reevaluando la expresión, posiblemente desencadenando otras reevaluaciones similares en la cadena de dependencias. .
Por lo general, este comportamiento reactivo se logra mediante el uso inteligente del patrón de observación, donde un valor reactivo se registra a sí mismo como un oyente de un conjunto de eventos que desencadenan la reevaluación del valor.
Que yo sepa, no existe un lenguaje de programación que abarque por completo la programación reactiva en su núcleo, pero hay muchas bibliotecas en muchos lenguajes que ofrecen los beneficios de la programación reactiva de una forma u otra.
La mayoría de los marcos de enlace de datos pueden considerarse implementaciones de programación reactiva .
Hay un buen artículo sobre " Depreciar el patrón de observador ", que probablemente explicará mucho mejor que nunca, de qué se trata la programación reactiva y qué ofrecería una implementación de la misma más allá de las técnicas ya existentes.
fuente
Lisp (y sus muchos dialetcs, incluido Scheme) lo tiene:
evalúa
do-something
y:evalúa
nil
ao su equivalente.fuente
when
es más como un if, no el patrón de observador descrito inadvertidamente por el OP.Conozco un tipo de declaración solo para el manejo de errores. Por ejemplo, BASIC
ON ERROR ...
o SQL * PLUSWHENEVER SQLERROR ...
Para condiciones arbitrarias, requeriría un compilador extremadamente inteligente o un tipo de fuerza bruta bastante costosa (verifique después de cada declaración) para captar el momento exacto en que las condiciones se vuelven verdaderas.
fuente
Es una característica de los lenguajes de flujo de datos, como los lenguajes de descripción de hardware (Verilog y VHDL).
Aparte de eso, puedo pensar en Ada y su mecanismo de manejo de excepciones: se desencadena
when
un controlador de excepciones. Se genera una excepción.fuente
Parece que está buscando variables de condición , cosas que permiten que los subprocesos duerman hasta que algún predicado se haga realidad.
Boost los implementa para C ++, el Apache Portable Runtime los implementa para C. En Common Lisp usarías
bordeaux-thread
los demake-condition-variable
.fuente
Si consideras que Drools es un idioma, entonces sí.
Un ejemplo:
fuente
Perl 6 puede manejar señales de manera directa usando
tap
:mientras que Powershell puede manejarlo usando un ciclo de ejecución con un bloque try / finally:
como puede esperar usando
trap
:Referencias
Manejar una señal - Código Rosetta
Tablas de decisión - Código Rosetta
fuente
Ha pasado MUCHO tiempo desde que los vi, así que podría estar equivocado.
Según recuerdo, PL / I y BASIC tenían declaraciones "ON". En PL / I, el concepto era "ON DO". En BASIC, estaba "ENCENDIDO", donde la declaración generalmente era un GOSUB. En ambos idiomas, cuando la condición especificada se convirtió en verdadera, se ejecutaron las declaraciones asociadas.
No querrías hacer esto hoy. El compilador básicamente tiene que hacer un montón de trabajo, para descubrir dónde / cuándo la condición podría volverse verdadera, para que pueda generar una prueba en ese punto. Una vez que está en el controlador asociado, no sabe realmente de dónde viene, por lo que tiene que averiguar qué sucedió para llegar allí, y probablemente no quiera volver a su lugar de origen.
fuente
Puede echar un vistazo al lenguaje OPS5 . Sus programas están escritos como un conjunto de condiciones. Cuando se cumple una condición, se realiza la acción correspondiente. Las acciones pueden modificar el estado, lo que puede hacer que se cumplan otras condiciones. Si bien no utiliza la
when
palabra clave, funciona esencialmente realizando acciones "cuando" se cumple una condición. Desde aquí :Tuve que escribir una aventura de texto simple en este idioma cuando estaba en la universidad a principios de los 90. Fue interesante, pero no estoy seguro de lo útil que sería para la mayoría de las tareas de escritorio o móviles. Sin embargo, podría tener sentido en un entorno de back-end.
fuente
Haskell tiene uno. Pero no es una construcción especial, solo otra función http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:when
fuente
En la mayoría de los lenguajes OOP sería posible generar un hilo adicional, tenga esto como contexto:
fuente
Bueno, podría escribir un montón de hilos paralelos, cada uno de los cuales sondea su respectiva condición. Supongo que sería una aplicación de bajo rendimiento, pero es posible.
fuente