Apa yang Anda bicarakan kurang sintaksis daripada struktur . Anda benar-benar hanya dapat memiliki when
pernyataan seperti itu dalam sistem yang mengeksekusi jumlah logika yang terbatas, kemudian mengeksekusi when
pernyataan, kemudian memutar dan mengeksekusi logika lagi, melanjutkan dalam loop yang tak terbatas.
Misalnya pemrograman Windows biasanya "berbasis acara". Berlangganan acara tombol pada Click
dasarnya berarti "lakukan ini saat diklik". Namun, apa yang terjadi di bawah tenda adalah loop pemrosesan pesan. Windows mengirim pesan ke aplikasi ketika pengguna mengklik tombol, dan loop pemrosesan pesan di aplikasi menjalankan pengendali acara yang sesuai.
Jika Anda menggunakan acara di, misalnya, C #, Anda dapat melakukan ini tanpa loop pesan, tetapi batasannya adalah Anda harus mendeklarasikan acara sebelumnya, jadi Anda tidak dapat menulis when
pernyataan artibrary yang mengawasi segala jenis negara. Anda harus menunggu acara tertentu.
Untuk mendapatkan perilaku ini dalam Arsitektur Von Neumann Anda harus menjalankan semacam infinite loop yang memeriksa semua kondisi setiap kali melalui loop menjalankan kode yang sesuai jika sesuai. Internal Anda hanya mendapatkan daftar besar if
/ then
atau switch
pernyataan. Sebagian besar aplikasi desktop dan pemrogram web akan muntah jika mereka melihat konstruksi seperti itu sehingga benar-benar hanya enak jika Anda membungkusnya dengan semacam gula sintaksis seperti model acara Windows (meskipun itulah yang terjadi di bawah tenda).
Di sisi lain, jika Anda melihat bidang pengembangan firmware tertanam, eksekutif waktu nyata, atau pengontrol industri, model pemrograman ini sangat umum. Misalnya, jika Anda memiliki program waktu nyata, Anda mungkin ingin mengungkapkan:
outputA = input1 && input2
Kode ini mudah dipahami (karena bersifat deklaratif). Namun, untuk membuatnya bekerja, Anda harus menjalankannya dalam lingkaran yang ketat. Anda mengevaluasi kembali outputA
setiap kali melalui loop. Banyak pemrogram desktop atau web tidak akan menyukai ini karena tidak efisien. Bagi mereka, satu-satunya waktu Anda harus mengevaluasi kembali outputA
adalah kapan input1
atau input2
berubah. Mereka lebih suka melihat sesuatu yang lebih seperti Anda gambarkan:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Sekarang jika ini yang Anda inginkan (dan secara pribadi saya tidak suka ide ini), dan tujuan Anda adalah efisiensi, maka Anda masih harus bertanya pada diri sendiri apa yang sedang dilakukan prosesor di bawah tenda. Jelas masih ada semacam loop berjalan yang membandingkan status input ke status input sebelumnya setiap kali, dan mengeksekusi kode yang sesuai setiap kali ada perubahan. Jadi sebenarnya ini kurang efisien dan lebih sulit untuk dibaca dan lebih sulit untuk dipertahankan.
Di sisi lain, jika pekerjaan yang harus Anda lakukan ketika input1
perubahan signifikan, maka when
klausa Anda mungkin masuk akal. Dalam PLC jenis instruksi ini disebut "deteksi tepi naik". Ini menyimpan keadaan input1
pada saat terakhir melalui loop, membandingkannya dengan nilai saat ini, dan mengeksekusi logika jika keadaan terakhir salah dan keadaan ini benar.
Jika Anda tidak memiliki Arsitektur Von Neumann, maka gamenya berubah. Misalnya jika Anda memprogram FPGA dalam VHDL , maka saat Anda menulis:
outputA = input1 && input2
(... Atau apa pun sintaks VHDL yang sesuai akan) maka FPGA benar-benar akan ditransfer sedemikian rupa input1
dan input2
ditransfer ke input gerbang AND, dan output dari gerbang AND ditransfer ke outputA
. Jadi, kode ini tidak hanya mudah dimengerti, tetapi juga dijalankan secara paralel dengan semua logika lainnya, dan juga efisien.
Saat Anda berbicara tentang pengontrol industri seperti PLC atau PAC, yang diprogram dalam salah satu dari lima bahasa IEC-61131-3, kasus umumnya adalah pengaturan seperti ini:
- Baca input dan simpan di memori
- Jalankan program utama
- Tulis output dari memori ke output aktual
- Lanjutkan ke langkah 1
Ini dibangun ke dalam arsitektur sistem, jadi diharapkan Anda hanya akan menulis:
outputA = input1 && input2
... dan itu akan dieksekusi dalam satu loop berkelanjutan
Ada juga interupsi rutin di mesin ini. Ini lebih seperti dukungan tingkat perangkat keras untuk when
operator yang sedang Anda bicarakan. The interrupt hardware merupakan sarana mengeksekusi beberapa kode pada sebuah peristiwa eksternal. Misalnya, ketika kartu jaringan mengatakan bahwa ia memiliki data yang menunggu, prosesor biasanya harus segera membaca data itu atau Anda akan kehabisan ruang buffer. Namun, untuk berapa kali Anda perlu mengaitkan interupsi perangkat keras yang sebenarnya, saya ragu memasukkan kata kunci bahasa untuk itu bermanfaat. Anda akan terbatas pada pin input CPU, dan sepertinya Anda ingin menguji status program internal.
Jadi, dalam bahasa tradisional (tanpa loop ketat yang berjalan tanpa batas) Anda harus mengajukan pertanyaan, "kapan kode evaluasi berjalan"?
Jika Anda menulis:
when A do
launchNukes()
... dan dengan asumsi A
adalah ekspresi boolean yang sewenang-wenang, bagaimana Anda tahu kapan harus mengevaluasi kembali ekspresi itu? Implementasi yang naif berarti Anda harus mengevaluasi kembali setelah setiap memori tunggal ditulis. Anda mungkin berpikir bahwa Anda dapat mempersempitnya, tetapi pertimbangkan ini:
when systemTime > actionTime do
launchNukes()
Perhatikan bahwa systemTime
selalu berubah (setiap kali Anda membacanya, Anda akan mendapatkan nomor yang berbeda). Ini berarti bahwa bagian bersyarat dari semua when
klausa Anda harus dievaluasi ulang secara terus menerus. Itu hampir mustahil (dan pertimbangkan sejenak apa yang terjadi jika ekspresi kondisional Anda memiliki efek samping!)
Kesimpulan
Anda hanya dapat memiliki when
pernyataan (seperti yang Anda gambarkan) dalam arsitektur berbasis di sekitar loop tak terbatas yang menjalankan program utama, lalu jalankan when
pernyataan jika kondisinya berubah dari false menjadi true pada loop ini. Meskipun arsitektur ini umum di perangkat yang disematkan dan industri, itu tidak umum dalam bahasa pemrograman tujuan umum.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...
. Juga: msdn.microsoft.com/en-us/library/dd233249.aspx Pada dasarnya saya akan melakukan pencarian untuk "kapan" menggunakan pencarian kode Google.