Sie sprechen von weniger Syntax als von Struktur . whenIn einem System, das eine endliche Menge an Logik ausführt, dann die whenAnweisungen ausführt , dann eine Schleife durchläuft und die Logik erneut ausführt, könnte man wirklich nur eine solche Anweisung haben, die in einer Endlosschleife fortgesetzt wird.
Beispielsweise ist die Windows-Programmierung typischerweise "ereignisbasiert". Das Abonnieren eines Schaltflächenereignisses bedeutet im ClickWesentlichen "Tun Sie dies, wenn Sie darauf klicken". Was sich jedoch unter der Haube abspielt, ist eine Nachrichtenverarbeitungsschleife. Windows sendet eine Nachricht an die Anwendung, wenn der Benutzer auf die Schaltfläche klickt und die Nachrichtenverarbeitungsschleife in der Anwendung den entsprechenden Ereignishandler ausführt.
Wenn Sie Ereignisse beispielsweise in C # verwenden, können Sie dies ohne eine Meldungsschleife tun. Die Einschränkung besteht jedoch darin, dass Sie das Ereignis im Voraus deklarieren müssen, sodass Sie keine Artibrary- whenAnweisung schreiben können , die auf irgendeine Art von überwacht Zustand. Sie müssen auf ein bestimmtes Ereignis warten.
Um dieses Verhalten in einer Von Neumann-Architektur zu erzielen, müssen Sie eine Endlosschleife ausführen, die bei jeder Ausführung des entsprechenden Codes den entsprechenden Code auf alle Bedingungen überprüft. Intern erhalten Sie nur eine große Liste von if/ thenoder switchAussagen. Die meisten Desktop-Anwendungen und Web-Programmierer würden sich übergeben, wenn sie ein solches Konstrukt sehen würden, sodass es wirklich nur dann schmackhaft ist, wenn Sie es in eine Art syntaktischen Zucker wie das Windows-Ereignismodell einwickeln (auch wenn dies unter der Haube geschieht).
Auf der anderen Seite ist dieses Programmiermodell sehr verbreitet, wenn Sie sich mit der Entwicklung eingebetteter Firmware, Echtzeit-Führungskräften oder industriellen Controllern befassen. Wenn Sie beispielsweise ein Echtzeitprogramm haben, möchten Sie möglicherweise Folgendes ausdrücken:
outputA = input1 && input2
Der Code ist einfach zu verstehen (weil er deklarativ ist). Damit es funktioniert, müssen Sie es jedoch in einer engen Schleife ausführen. Sie bewerten outputAjedes Mal durch die Schleife neu. Viele Desktop- oder Web-Programmierer würden das nicht mögen, weil es ineffizient ist. Für sie ist das einzige Mal, dass Sie neu bewerten sollten, outputAwann input1oder input2Änderungen. Sie würden lieber etwas sehen, das Sie beschreiben:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Wenn Sie dies möchten (und ich persönlich bevorzuge diese Idee nicht) und Ihr Ziel die Effizienz ist, müssen Sie sich immer noch fragen, was der Prozessor unter der Haube tut. Offensichtlich läuft immer noch eine Art Schleife, die die Eingabezustände jedes Mal mit den vorherigen Eingabezuständen vergleicht und bei jeder Änderung den entsprechenden Code ausführt. Es ist weniger effizient und schwieriger zu lesen und zu warten.
Wenn andererseits die Arbeit, die Sie bei input1Änderungen leisten müssen, erheblich ist, ist Ihre whenKlausel möglicherweise sinnvoll. In SPS wird diese Art der Anweisung als "Erkennung ansteigender Flanken" bezeichnet. Es speichert den Zustand des input1letzten Males durch die Schleife, vergleicht ihn mit dem Wert dieses Mal und führt die Logik aus, wenn der letzte Zustand falsch war und dieser Zustand wahr ist.
Wenn Sie keine Von Neumann-Architektur haben, ändert sich das Spiel. Zum Beispiel, wenn Sie ein FPGA in VHDL programmieren , dann wenn Sie schreiben:
outputA = input1 && input2
(... oder was auch immer die geeignete VHDL - Syntax wäre) , dann die FPGA wird tatsächlich verdrahtet , so daß input1und input2ist mit dem Eingang eines UND - Gatter geschaltet, und der Ausgang der UND - Gatter wird zu verdrahten outputA. Daher ist der Code nicht nur leicht zu verstehen, sondern wird auch parallel zu allen anderen Logikfunktionen ausgeführt und ist effizient.
Wenn es sich um eine industrielle Steuerung wie eine SPS oder ein PAC handelt, die bzw. das in einer der fünf IEC-61131-3-Sprachen programmiert ist, ist der typische Fall diese Art von Anordnung:
- Eingaben lesen und im Speicher ablegen
- Hauptprogramm ausführen
- Schreiben Sie die Ausgänge aus dem Speicher in die tatsächlichen Ausgänge
- Fahren Sie mit Schritt 1 fort
Dies ist in die Architektur des Systems integriert. Sie müssen also nur schreiben:
outputA = input1 && input2
... und es wird in einer Endlosschleife ausgeführt.
Es gibt auch Unterbrechungsroutinen in diesen Maschinen. Dies entspricht eher der Unterstützung auf Hardwareebene für den whenOperator, über den Sie sprechen. Der Hardware-Interrupt dient zum Ausführen von Code für ein externes Ereignis. Wenn beispielsweise eine Netzwerkkarte angibt, dass Daten warten, muss der Prozessor diese Daten normalerweise sofort lesen, da sonst der Pufferplatz knapp wird. Für die Häufigkeit, mit der Sie einen echten Hardware-Interrupt einbinden müssen, bezweifle ich jedoch, dass die Angabe eines Sprachschlüsselworts dafür sinnvoll ist. Sie wären auf CPU-Eingangspins beschränkt, und es sieht so aus, als wollten Sie den internen Programmstatus testen.
In einer traditionellen Sprache (ohne eine enge Schleife, die unendlich läuft) müssen Sie also die Frage stellen: "Wann wird der Evaluierungscode ausgeführt?"
Wenn du schreibst:
when A do
launchNukes()
... und wenn Aes sich um einen beliebigen booleschen Ausdruck handelt, woher wissen Sie, wann Sie diesen Ausdruck neu bewerten müssen? Eine naive Implementierung würde bedeuten, dass Sie sie nach jedem einzelnen Speicherschreiben neu auswerten müssen. Sie könnten denken, dass Sie es eingrenzen können, aber bedenken Sie Folgendes:
when systemTime > actionTime do
launchNukes()
Beachten Sie, dass systemTimesich dies immer ändert (jedes Mal, wenn Sie es lesen, erhalten Sie eine andere Nummer). Dies bedeutet, dass der bedingte Teil aller Ihrer whenKlauseln fortlaufend neu bewertet werden muss. Das ist fast unmöglich (und überlegen Sie sich kurz, was passiert, wenn Ihr bedingter Ausdruck Nebenwirkungen hat!)
Fazit
Sie können eine whenAnweisung (wie Sie sie beschreiben) nur in einer Architektur haben, die auf einer Endlosschleife basiert, in der das Hauptprogramm ausgeführt wird. Anschließend werden die whenAnweisungen ausgeführt, wenn die Bedingungen in dieser Schleife von false auf true geändert wurden. Während diese Architektur in eingebetteten und industriellen Geräten üblich ist, ist sie in allgemeinen Programmiersprachen nicht üblich.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from .... Außerdem: msdn.microsoft.com/en-us/library/dd233249.aspx Grundsätzlich würde ich mithilfe der Google- Codesuche nach "when" suchen.