Quello di cui stai parlando è meno sintassi della struttura . Potresti davvero avere when
un'affermazione come quella in un sistema che esegue una quantità finita di logica, quindi esegue le when
istruzioni, quindi gira intorno ed esegue di nuovo la logica, continuando in un ciclo infinito.
Ad esempio, la programmazione di Windows è in genere "basata sugli eventi". Iscriversi Click
all'evento di un pulsante significa essenzialmente "farlo quando si fa clic". Tuttavia, quello che succede sotto il cofano è un ciclo di elaborazione dei messaggi. Windows invia un messaggio all'applicazione quando l'utente fa clic sul pulsante e il ciclo di elaborazione dei messaggi nell'applicazione esegue il gestore eventi appropriato.
Se usi eventi in, ad esempio, in C #, puoi farlo senza un ciclo di messaggi, ma la limitazione è che devi dichiarare l'evento in anticipo, quindi non puoi scrivere un'istruzione di artibrary when
che controlli qualsiasi tipo di stato. Devi aspettare un evento specifico.
Per ottenere questo comportamento in una Von Neumann Architecture devi eseguire una sorta di ciclo infinito che controlla tutte le condizioni ogni volta attraverso il ciclo che esegue il codice appropriato, se appropriato. Internamente ottieni solo un grande elenco di if
/ then
o switch
dichiarazioni. La maggior parte delle applicazioni desktop e dei programmatori web vomiterebbero se vedessero un tale costrutto, quindi è davvero appetibile solo se lo avvolgi in una sorta di zucchero sintattico come il modello di eventi di Windows (anche se è quello che succede sotto il cofano).
D'altra parte, se si guarda al campo dello sviluppo del firmware incorporato, dei dirigenti in tempo reale o dei controller industriali, questo modello di programmazione è molto comune. Ad esempio, se hai un programma in tempo reale, potresti voler esprimere:
outputA = input1 && input2
Il codice è semplice da capire (perché è dichiarativo). Tuttavia, per farlo funzionare devi eseguirlo in un ciclo stretto. Rivaluta outputA
ogni volta attraverso il ciclo. Molti programmatori desktop o web non gradirebbero questo perché è inefficiente. Per loro, l'unica volta che dovresti rivalutare outputA
è quando input1
o input2
cambia. Preferirebbero vedere qualcosa di più simile a quello che stai descrivendo:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Ora, se questo è quello che vuoi (e personalmente non preferisco questa idea), e il tuo obiettivo è l'efficienza, allora devi ancora chiederti cosa sta facendo il processore sotto il cofano. Ovviamente c'è ancora una sorta di ciclo in esecuzione che confronta gli stati di input con i precedenti stati di input ogni volta ed esegue il codice appropriato ogni volta che si cambia. Quindi è davvero meno efficiente ed è più difficile da leggere e più difficile da mantenere.
D'altra parte, se il lavoro che devi fare quando le input1
modifiche sono significative, la tua when
clausola potrebbe avere un senso. Nei PLC questo tipo di istruzione è chiamato "rilevamento del fronte di salita". Salva lo stato di input1
sull'ultima volta attraverso il ciclo, lo confronta con il valore questa volta ed esegue la logica se l'ultimo stato era falso e questo stato è vero.
Se non hai una Von Neumann Architecture, il gioco cambia. Ad esempio se stai programmando un FPGA in VHDL , quando scrivi:
outputA = input1 && input2
(... o qualunque la sintassi VHDL appropriato sarebbe) allora il FPGA fatto viene cablato tale che input1
e input2
sono cablati in ingresso ad una porta AND, e l'uscita della porta AND è cablato outputA
. Quindi, non solo il codice è facile da capire, è anche eseguito in parallelo con tutte le altre logiche ed è efficiente.
Quando si parla di un controller industriale come un PLC o PAC, programmato in una delle cinque lingue IEC-61131-3, il caso tipico è questo tipo di disposizione:
- Leggi gli input e memorizza in memoria
- Eseguire il programma principale
- Scrivi le uscite dalla memoria alle uscite effettive
- Vai al passaggio 1
Questo è integrato nell'architettura del sistema, quindi è previsto che tu scriva:
outputA = input1 && input2
... e verrà eseguito in un ciclo continuo.
Esistono anche routine di interruzione in queste macchine. Questi sono più simili al supporto a livello hardware per l' when
operatore di cui stai parlando. L' interruzione hardware è un mezzo per eseguire del codice su un evento esterno. Ad esempio, quando una scheda di rete indica che i dati sono in attesa, il processore deve normalmente leggerli immediatamente o si esaurisce lo spazio del buffer. Tuttavia, per la quantità di volte che è necessario agganciare un interrupt hardware reale, dubito che sia utile includere una parola chiave in lingua. Saresti limitato ai pin di input della CPU e sembra che tu voglia testare lo stato del programma interno.
Quindi, in un linguaggio tradizionale (senza un circuito chiuso che gira all'infinito) devi porre la domanda "quando viene eseguito il codice di valutazione"?
Se scrivi:
when A do
launchNukes()
... e supponendo che A
sia un'espressione booleana arbitraria, come fai a sapere quando rivalutare quell'espressione? Un'implementazione ingenua significherebbe che è necessario rivalutarla dopo ogni singola scrittura di memoria. Potresti pensare di poterlo restringere, ma considera questo:
when systemTime > actionTime do
launchNukes()
Nota che systemTime
cambia sempre (ogni volta che lo leggi otterrai un numero diverso). Ciò significa che la parte condizionale di tutte le when
clausole deve essere rivalutata continuamente. È quasi impossibile (e considera solo per un secondo cosa succede se la tua espressione condizionale ha effetti collaterali!)
Conclusione
Puoi avere solo when
un'istruzione (come quella che stai descrivendo) in un'architettura basata su un ciclo infinito che esegue il programma principale, quindi esegue le when
istruzioni se le condizioni sono passate da false a true su questo ciclo. Sebbene questa architettura sia comune nei dispositivi embedded e industriali, non è comune nei linguaggi di programmazione generici.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...
. Inoltre: msdn.microsoft.com/en-us/library/dd233249.aspx Fondamentalmente farei una ricerca di "quando" usando la ricerca del codice di Google.