Те, про що ви говорите, менше синтаксису, ніж структури . Ви дійсно могли мати лише таке whenтвердження в системі, яка виконує обмежену кількість логіки, потім виконує whenоператори, потім петлі навколо та виконує логіку знову, продовжуючи у нескінченному циклі.
Наприклад, програмування Windows, як правило, "засноване на подіях". Підписка на Clickподію кнопки по суті означає "зробити це при натисканні". Однак, що відбувається під кришкою, це цикл обробки повідомлень. Windows надсилає повідомлення додатку, коли користувач натискає кнопку, і цикл обробки повідомлень у програмі запускає відповідний обробник подій.
Якщо ви використовуєте події, наприклад, на C #, ви можете це зробити без циклу повідомлень, але обмеженням є те, що ви повинні оголосити подію достроково, тому ви не можете написати архівну whenзаяву, яка спостерігає за будь-яким типом держава. Вам доведеться чекати конкретної події.
Для отримання такої поведінки в архітектурі Von Neumann вам потрібно запустити якийсь нескінченний цикл, який щоразу перевіряє всі умови через цикл, у якому, якщо це доречно, працює відповідний код. Всередині ви просто отримаєте великий список if/ thenабо switchтверджень. Більшість програм для настільних програм та веб-програмістів блювотіли, якби вони побачили таку конструкцію, тому вона справді приємна лише, якщо ви загорнете її в якийсь синтаксичний цукор, як модель події Windows (навіть якщо це відбувається під кришкою).
З іншого боку, якщо ви подивитесь на сферу розробки вбудованої прошивки, виконавців у режимі реального часу або промислових контролерів, ця модель програмування є дуже поширеною. Наприклад, якщо у вас є програма в режимі реального часу, ви можете висловити:
outputA = input1 && input2
Код легко зрозуміти (бо він декларативний). Однак для того, щоб він працював, потрібно виконати його в тісному циклі. Ви outputAкожного разу повторно оцінюєте через цикл. Багатьом настільних або веб-програмістів це не сподобається, оскільки це неефективно. Для них єдиний раз, коли ви повинні переоцінити, outputAце коли input1або input2зміни. Вони швидше побачать щось більше, як ви описуєте:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Тепер, якщо це те, що ви хочете (і особисто я не віддаю перевагу цій ідеї), а ваша мета - ефективність, то вам все одно доведеться запитати себе, що робить процесор під кришкою. Очевидно, що все ще працює якийсь цикл, який кожного разу порівнює вхідні стани з попередніми вхідними станами та виконує відповідний код щоразу, коли змінюється. Так що насправді це менш ефективно і важче читати і важче підтримувати.
З іншого боку, якщо робота, яку вам доведеться виконати, коли input1зміни є суттєвими, ваш whenпункт може мати сенс. У ПЛК цей тип інструкцій називають "виявленням зростаючих країв". Він зберігає стан input1останнього разу через цикл, порівнює його зі значенням цього разу та виконує логіку, якщо останній стан був помилковим і цей стан є істинним.
Якщо у вас немає архітектури Von Neumann, то гра змінюється. Наприклад, якщо ви програмуєте FPGA в VHDL , тоді, коли ви пишете:
outputA = input1 && input2
(... або будь-який інший відповідний синтаксис VHDL буде) , то FPGA , на самому ділі отримує провідний вгору таким чином, що input1і input2підключені до входу логічного елемента, а вихід логічної схеми І підключений до outputA. Отже, код не тільки зрозумілий, він також виконується паралельно з усіма іншими логіками, і він ефективний.
Якщо ви говорите про такий промисловий контролер, як PLC або PAC, запрограмований на одній з п'яти мов IEC-61131-3, типовим випадком є такий тип розташування:
- Читати входи та зберігати в пам'яті
- Виконати основну програму
- Запишіть виходи з пам'яті на фактичні виходи
- Перейдіть до першого кроку
Це вбудовано в архітектуру системи, тому очікується, що ви просто напишите:
outputA = input1 && input2
... і він буде виконаний у безперервному циклі.
У цих машинах також є процедури перерв. Вони більше схожі на підтримку апаратного рівня для whenоператора, про який ви говорите. Апаратне переривання є засобом виконання деякого коду на зовнішнє подія. Наприклад, коли на мережевій карті йдеться про очікування даних, процесор, як правило, повинен негайно прочитати ці дані, або у вас не вистачить місця в буфері. Однак, скільки разів вам потрібно підключити справжнє апаратне переривання, я сумніваюся, що включити мовне ключове слово для цього варто. Ви будете обмежені вхідними штифтами процесора, і схоже, що ви хочете перевірити стан програми.
Отже, у традиційній мові (без щільного циклу, який працює нескінченно), ви повинні задати питання "коли працює код оцінювання"?
Якщо ви пишете:
when A do
launchNukes()
... і якщо припустити A, що це довільний булевий вираз, як ви знаєте, коли переоцінити цей вираз? Наївна реалізація означатиме, що вам доведеться переоцінювати її після кожного запису в пам'ять. Вам може здатися, що ви можете його звузити, але врахуйте це:
when systemTime > actionTime do
launchNukes()
Зауважте, що systemTimeзавжди змінюється (щоразу, коли ви читаєте, ви отримуєте інше число). Це означає, що умовна частина всіх ваших whenстатей повинна постійно оцінюватися. Це майже неможливо (і просто подумайте на секунду, що станеться, якщо ваше умовне вираження має побічні ефекти!)
Висновок
Ви можете мати whenвисловлювання (як ви описуєте) лише в архітектурі, що базується на нескінченному циклі, який запускає основну програму, а потім виконує whenоператори, якщо в цьому циклі умови перейшли від неправдивого до істинного. Хоча ця архітектура є загальною для вбудованих та промислових пристроїв, вона не є загальною для мов програмування загального призначення.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from .... Також: msdn.microsoft.com/en-us/library/dd233249.aspx В основному я б здійснив пошук "при" за допомогою пошуку коду Google.