O que você está falando é menos sintaxe que estrutura . Você poderia realmente ter apenas uma whendeclaração como essa em um sistema que executa uma quantidade finita de lógica, depois executa as wheninstruções, circula e executa a lógica novamente, continuando em um loop infinito.
Por exemplo, a programação do Windows é tipicamente "baseada em eventos". A inscrição no Clickevento de um botão significa essencialmente "faça isso quando clicado". No entanto, o que está acontecendo sob o capô é um loop de processamento de mensagens. O Windows envia uma mensagem para o aplicativo quando o usuário clica no botão e o loop de processamento de mensagens no aplicativo executa o manipulador de eventos apropriado.
Se você usar eventos em, por exemplo, C #, poderá fazer isso sem um loop de mensagem, mas a limitação é que você deve declarar o evento antes do tempo, para não poder escrever uma whendeclaração da biblioteca de arte que preste atenção a qualquer tipo de Estado. Você tem que esperar por um evento específico.
Para obter esse comportamento em uma arquitetura Von Neumann, é necessário executar algum tipo de loop infinito que verifica todas as condições todas as vezes no loop executando o código apropriado, se apropriado. Internamente você acabou de obter uma grande lista de if/ thenou switchdeclarações. A maioria dos programadores de aplicativos de área de trabalho e da Web vomitaria se vislumbrem essa construção, então é realmente apenas palatável se você a envolver em algum tipo de açúcar sintático, como o modelo de evento do Windows (mesmo que seja o que está acontecendo sob o capô).
Por outro lado, se você observar o campo do desenvolvimento de firmware incorporado, executivos em tempo real ou controladores industriais, esse modelo de programação é muito comum. Por exemplo, se você possui um programa em tempo real, pode querer expressar:
outputA = input1 && input2
O código é simples de entender (porque é declarativo). No entanto, para fazê-lo funcionar, você deve executá-lo em um circuito fechado. Você reavalia outputAtodas as vezes através do loop. Muitos programadores de desktop ou web não gostariam disso porque é ineficiente. Para eles, o único momento em que você deve reavaliar outputAé quando input1ou input2muda. Eles preferem ver algo mais como você está descrevendo:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Agora, se é isso que você deseja (e pessoalmente não prefiro essa ideia), e seu objetivo é a eficiência, você ainda precisa se perguntar o que o processador está fazendo sob o capô. Obviamente, ainda existe algum tipo de loop em execução que compara os estados de entrada com os estados de entrada anteriores toda vez e executa o código apropriado sempre que alguém muda. Então, na verdade, é menos eficiente e é mais difícil de ler e mais difícil de manter.
Por outro lado, se o trabalho que você tiver que fazer quando as input1alterações forem significativas, sua whencláusula poderá fazer sentido. Nos CLPs, esse tipo de instrução é chamado de "detecção de borda ascendente". Ele salva o estado da input1última vez através do loop, compara-o com o valor dessa vez e executa a lógica se o último estado for falso e esse estado for verdadeiro.
Se você não possui uma arquitetura Von Neumann, o jogo muda. Por exemplo, se você estiver programando um FPGA em VHDL , quando escrever:
outputA = input1 && input2
(... ou o que a sintaxe VHDL apropriado seria), então o FPGA realmente obtém com fio de tal forma que input1e input2são conectados à entrada de uma porta AND, ea saída da porta AND é ligado a outputA. Portanto, o código não é apenas fácil de entender, ele também é executado em paralelo com todas as outras lógicas e é eficiente.
Quando se fala de um controlador industrial como um CLP ou PAC, programado em um dos cinco idiomas IEC-61131-3, o caso típico é esse tipo de arranjo:
- Leia entradas e armazene na memória
- Executar programa principal
- Gravar saídas da memória para saídas reais
- Avance para o passo 1
Isso está embutido na arquitetura do sistema, portanto, é esperado que você escreva:
outputA = input1 && input2
... e será executado em um loop contínuo.
Também existem rotinas de interrupção nessas máquinas. São mais como o suporte de nível de hardware para o whenoperador que você está falando. A interrupção do hardware é um meio de executar algum código em um evento externo. Por exemplo, quando uma placa de rede diz que possui dados em espera, o processador normalmente precisa ler esses dados imediatamente ou você ficará sem espaço no buffer. No entanto, pela quantidade de vezes que você precisa conectar uma interrupção real de hardware, duvido que inclua uma palavra-chave no idioma, pois vale a pena. Você estaria limitado aos pinos de entrada da CPU e parece que deseja testar o estado interno do programa.
Então, em uma linguagem tradicional (sem um loop apertado que é executado infinitamente), você precisa fazer a pergunta "quando o código de avaliação é executado"?
Se você escrever:
when A do
launchNukes()
... e assumindo que Aé uma expressão booleana arbitrária, como você sabe quando reavaliar essa expressão? Uma implementação ingênua significaria que você deveria reavaliar após cada gravação na memória. Você pode pensar que pode reduzi-lo, mas considere o seguinte:
when systemTime > actionTime do
launchNukes()
Observe que systemTimeestá sempre mudando (toda vez que você lê, você obtém um número diferente). Isso significa que a parte condicional de todas as suas whencláusulas deve ser reavaliada continuamente. Isso é quase impossível (e considere por um segundo o que acontece se sua expressão condicional tiver efeitos colaterais!)
Conclusão
Você só pode ter uma wheninstrução (como você está descrevendo) em uma arquitetura baseada em um loop infinito que executa o programa principal e, em seguida, executa as wheninstruções se as condições forem de falsa para verdadeira nesse loop. Embora essa arquitetura seja comum em dispositivos embarcados e industriais, não é comum em linguagens de programação de uso geral.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from .... Também: msdn.microsoft.com/en-us/library/dd233249.aspx Basicamente, eu faria uma pesquisa por "when" usando a pesquisa de código do Google.