То, о чем вы говорите, это меньше синтаксис, чем структура . В действительности вы могли бы иметь только такое whenутверждение в системе, которая выполняет конечное количество логики, затем выполняет whenоператоры, затем циклично повторяет и снова выполняет логику, продолжая бесконечный цикл.
Например, программирование Windows обычно основано на событиях. Подписка на Clickсобытие кнопки по сути означает «делать это при нажатии». Однако то, что происходит под капотом, - это цикл обработки сообщений. Windows отправляет сообщение приложению, когда пользователь нажимает кнопку, и цикл обработки сообщений в приложении запускает соответствующий обработчик событий.
Если вы используете события, например, в C #, вы можете сделать это без цикла сообщений, но ограничение заключается в том, что вы должны объявлять событие заранее, поэтому вы не можете написать произвольную whenинструкцию, которая отслеживает любой вид государство. Вы должны ждать определенного события.
Чтобы получить такое поведение в архитектуре фон Неймана, вы должны запустить какой-то бесконечный цикл, который каждый раз проверяет все условия через цикл, выполняющий соответствующий код, если это необходимо. Внутренне вы просто получаете большой список 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в последний раз в цикле, сравнивает его со значением на этот раз и выполняет логику, если последнее состояние было ложным и это состояние истинно.
Если у вас нет архитектуры фон Неймана, то игра меняется. Например, если вы программируете FPGA на VHDL , то когда вы пишете:
outputA = input1 && input2
(... или любой другой соответствующий синтаксис VHDL будет) , то FPGA , на самом деле получает проводной вверх таким образом, что input1и input2подключены к входу логического элемента, а выход логической схемы И подключен к outputA. Таким образом, код не только прост для понимания, он также выполняется параллельно со всей другой логикой и эффективен.
Когда вы говорите о промышленном контроллере, таком как PLC или PAC, запрограммированном на одном из пяти языков IEC-61131-3, типичным случаем является такая схема:
- Читать входные данные и хранить в памяти
- Выполнить основную программу
- Запись выходов из памяти на фактические выходы
- Перейти к шагу 1
Это встроено в архитектуру системы, поэтому ожидается, что вы просто напишите:
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.