回答:
あなたの質問は明確ではありませんが、Observerパターンはあなたが探しているもののようですhttp://en.wikipedia.org/wiki/Observer_pattern
構文に関しては、かなりの数の言語にwhen
キーワードがありますが、私はそれをあなたが説明する方法で使用する言語を知りません。
「Xが発生するときYを実行する」パターンは、アスペクト指向プログラミングのコアの一種です。線形フローを定義する代わりに、ハンドラーを特定の条件にフックします(別名「イベント」をサブスクライブする)。この種のプログラミングは、プログラムのコアルーチンがイベントディスパッチャーであるGUIアプリケーションで一般的です。
一部の言語には、言語構造を通じてそのようなメカニズムを提供するための広範な構文機能があります。例は、デリゲートとイベントを含むC#です。
// 'when btnOK is clicked, run HandleOKClick'
btnOK.Clicked += this.HandleOKClick;
他の言語はOOPコンストラクトを使用します(オブザーバーパターン、イベントリスナーなど。Javaの例(私のJavaは少しさびているので、自由に編集してください)。
Foobar f = this;
btnOK.registerClickHandler(
new ClickHandler {
public void handleClick(Event e) {
f.handleOKClick(e);
}
});
さらに別のアプローチは、プレーンコールバックを使用することです。JavaScriptの例:
var btnOK = $('btnOK');
btnOK.click(handleOKClick);
INTERCALのCOMEFROMについてはまだ誰も言及していません。
COMEFROMは当初、ジョークアセンブリ言語命令のリストで見られました(「CMFRM」として)。1973年にR.ローレンスクラークによってDatamationの記事で詳しく説明されていました。COMEFROMは最終的に、難解なプログラミング言語INTERCALのC-INTERCALバリアントに、さらに曖昧な「計算されたCOMEFROM」とともに実装されました。「割り当てられたCOME FROM」と「DONT」キーワード(既存の「DO」ループを補完する)についてのFortranの提案もありました。
2004年4月1日に、Richie Hindleは、Pythonプログラミング言語用のGOTOとCOMEFROMの両方の実装を公開しました。エイプリルフールの日にリリースされ、深刻な使用を意図していないにもかかわらず、構文は有効であり、実装は完全に機能します。
Tcl言語には変数のトレースがあり、変数が設定される(または読み取りまたは削除されますが、ここではそれほど重要ではありません)ときはいつでも任意のコードを実行できます。その任意のコードには、式の評価と、保持されている場合のコードの実行が簡単に含まれます。主な制約は、ローカル変数に対してこれを行うことはできますが、寿命が非常に短い傾向があるため、一般的にはあまり有用ではないことです。(Tclにはクロージャーはありません。)
ただし、これを行う場合は注意が必要です。再入可能性の問題は公式にはありませんが(ボディの実行中はトレースが無効になります)、非常に不明瞭なコードを記述し、多くの混乱を引き起こす素晴らしい方法です。また、パフォーマンスヒットが非常に重要になる可能性があるため、ループ変数(デバッグ用以外)で使用するのは本当にひどい考えです。
例(上記のリンクされたマニュアルページのコードに基づく)が示しています。
set foo 1
set bar 2
proc doMult args {
global foo bar foobar
set foobar [expr {$foo * $bar}]
}
trace add variable foo write doMult
trace add variable bar write doMult
doMult
その時点から、どちらか$foo
または$bar
新しい整数に$foobar
なると、2つの積になります。自動的に。
Tclでは、コマンドの実行、コマンドの削除、タイマー、ソケットで利用可能になるデータなど、他の種類のトリガーで実行するコードの設定も可能です。Tkライブラリを追加すると、これは全体の大きなセットを含むように拡張されますGUIイベントも同様です。Tclが実際に非常に強力なイベント指向言語であると言うのは本当です(これらの機能をまったく使用しないコードも簡単に記述できる場合でも)。
はい、ステートメント修飾子としてPerlにそのようなキーワードがあります:
say 'Well done!' when 'A';
また、switchステートメントの一部です。
given ($foo) {
when (/^abc/) { $abc = 1; }
when (/^def/) { $def = 1; }
when (/^xyz/) { $xyz = 1; }
default { $nothing = 1; }
}
switch
私にとっての発言のような匂い。(その上に真鍮のノブでは、しかし、その後、再び、それはある ... Perlの)
case
にswitch
声明。エイダのように。
概要:
COMEFROMは、コード内の任意のポイントからCOMEFROMステートメントまで実行状態を取得できるという点で、GOTOとほぼ反対です。状態転送が発生するコード内のポイントは、通常、COMEFROMのパラメーターとして指定されます。指定された転送ポイントで命令の前後に転送が発生するかどうかは、使用される言語によって異なります。使用される言語に応じて、同じ出発点を参照する複数のCOMEFROMが無効であるか、非決定的であるか、何らかの定義済み優先順位で実行されるか、スレッド化インターカルで見られるように並列または並行実行を誘導する場合があります。
同期または非同期のwhenステートメントを持つ言語を探していますか?
私にはイベント(/サブスクリプション/コールバック)パターンのように聞こえます。
例えば
conditionOwner.Condition += listener.WhenCondition
条件の所有者が条件が発生したことを通知するたびに、リスナーはWhenCondition()を実行します。
複数の入力変数の状態(変更時)をチェックして条件を計算するコンバーターでバインディングパターンを使用し、リスナーの入力プロパティを出力にバインドして、その入力が変更されたときに動作することができます。
言語の時点で、たとえば.NET(C#など)には同期サブスクリプション(イベント)が組み込まれており、そのReactive Extensions(RX)は非同期サブスクリプションを追加します。
説明は、特定のシナリオを待って実行するように設計されたデータベーストリガーのように聞こえます。
ウィキペディアから:
データベーストリガーは、データベース内の特定のテーブルまたはビューの特定のイベントに応じて自動的に実行される手続き型コードです。トリガーは主に、データベース上の情報の整合性を保つために使用されます。たとえば、新しいレコード(新しいワーカーを表す)がemployeesテーブルに追加されると、税、休暇、および給与のテーブルにも新しいレコードが作成されます。
あなたが話しているのは、構造体より構文が少ないことです。実際には、有限量のロジックを実行し、ステートメントを実行し、ループを繰り返してロジックを再度実行し、無限ループで継続するシステムでのみ、そのようなステートメントを持つことができます。when
when
たとえば、Windowsプログラミングは通常「イベントベース」です。ボタンのClick
イベントをサブスクライブすることは、基本的に「クリックしたときにこれを実行する」ことを意味します。ただし、内部で行われているのは、メッセージ処理ループです。ユーザーがボタンをクリックすると、Windowsがアプリケーションにメッセージを送信し、アプリケーションのメッセージ処理ループが適切なイベントハンドラーを実行します。
たとえば、C#でイベントを使用する場合、メッセージループなしでこれを行うことができますが、制限は事前にイベントを宣言する必要があるwhen
ため、あらゆる種類のイベントを監視するアーティバリーステートメントを書くことはできません状態。特定のイベントを待つ必要があります。
Von Neumann Architectureでこの動作を実現するには、適切なコードを実行しているループを適切に実行するたびにすべての条件をチェックする何らかの無限ループを実行する必要があります。内部的には、if
/ then
またはswitch
ステートメントの大きなリストを取得するだけです。ほとんどのデスクトップアプリケーションとWebプログラマーは、このような構造を見たときに吐き出すので、Windowsイベントモデルのような何らかの構文的なシュガーでラップした場合にのみ味がします(それは内部で行われていますが)。
一方、組み込みファームウェア開発、リアルタイムエグゼクティブ、または産業用コントローラーの分野を見ると、このプログラミングモデルは非常に一般的です。たとえば、リアルタイムプログラムがある場合、次のように表現できます。
outputA = input1 && input2
コードはわかりやすい(宣言型であるため)。ただし、それを機能させるには、タイトなループで実行する必要があります。outputA
ループを通して毎回再評価します。多くのデスクトップまたはWebプログラマーは、非効率的であるため、これを好まないでしょう。彼らにとって、あなたが再評価しなければならないのoutputA
は、いつ、input1
またはinput2
変化するときだけです。彼らはむしろあなたが説明しているような何かを見たいと思います:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
これがあなたが望むものであり(そして個人的に私はこの考えを好まない)、そしてあなたの目標が効率であるなら、あなたはまだプロセッサがフードの下で何をしているのか自問する必要があります。明らかに、毎回入力状態を以前の入力状態と比較し、変化するたびに適切なコードを実行する何らかの種類のループがまだ実行されています。そのため、実際には効率が悪く、読みにくく、保守が困難です。
一方、input1
変更時に行う必要のある作業が重要な場合は、when
句が意味をなす場合があります。PLCでは、このタイプの命令は「立ち上がりエッジ検出」と呼ばれます。input1
ループの最後の状態を保存し、今回の値と比較し、最後の状態がfalseでこの状態がtrueの場合にロジックを実行します。
Von Neumann Architectureがない場合、ゲームは変わります。たとえば、VHDLでFPGAをプログラミングしている場合、次のように記述します。
outputA = input1 && input2
(...または適切なVHDL構文は次のようになり何でも)、次いでFPGAは、実際にはそのようなことまで配線されますinput1
とinput2
の入力ANDゲートに配線され、ANDゲートの出力がに配線されていますoutputA
。そのため、コードは理解しやすいだけでなく、他のすべてのロジックと並行して実行され、効率的です。
5つのIEC-61131-3言語のいずれかでプログラムされたPLCやPACなどの産業用コントローラーについて話しているとき、典型的なケースは次のような配置です。
これはシステムのアーキテクチャに組み込まれているため、次のように書くだけです。
outputA = input1 && input2
...そして、それは連続ループで実行されます。
これらのマシンには割り込みルーチンもあります。これらはwhen
、あなたが話しているオペレーターに対するハードウェアレベルのサポートに似ています。ハードウェア割り込みは、外部イベントにいくつかのコードを実行する手段です。たとえば、ネットワークカードに待機中のデータがあると言われた場合、通常、プロセッサはそのデータをすぐに読み取る必要があります。そうしないと、バッファスペースが不足します。ただし、実際のハードウェア割り込みをフックする必要がある場合、そのための言語キーワードを含めることは価値がありません。CPU入力ピンに制限され、内部プログラムの状態をテストしたいようです。
したがって、従来の言語(無限に実行されるタイトループなし)では、「評価コードはいつ実行されるか」という質問をする必要がありますか?
あなたが書く場合:
when A do
launchNukes()
...そしてA
、任意のブール式であると仮定すると、その式をいつ再評価するかをどのように知るのですか?単純な実装では、すべてのメモリ書き込みの後に再評価する必要があります。あなたはそれを絞り込むことができると思うかもしれませんが、これを考慮してください:
when systemTime > actionTime do
launchNukes()
systemTime
常に変化していることに注意してください(読むたびに、異なる番号が表示されます)。つまり、すべてのwhen
句の条件部分を継続的に再評価する必要があります。それはほとんど不可能です(条件式に副作用があるとどうなるかをちょっと考えてみてください!)
when
メインプログラムを実行し、when
このループで条件がfalseからtrueになった場合にステートメントを実行する無限ループに基づいたアーキテクチャーで、記述しているようなステートメントのみを持つことができます。このアーキテクチャは、組み込みデバイスや産業用デバイスでは一般的ですが、汎用プログラミング言語では一般的ではありません。
AspectJの言語は状況のまさにこのようなものを処理するための一つの解決策である参加ポイントモデルを、持っています。
AspectJのJoin-Pointは、プログラムの実行中に発生するJavaプログラムの動的イベントです。結合ポイントの例は次のとおりです。(1)メソッドが呼び出されます。(2)メソッドが実行されます。(3)コンストラクターが呼び出されます。(4)コンストラクターが実行されます。(5)フィールドが設定されています。または(6)フィールドにアクセスします。
その後、ポイントカットと呼ばれるこれらの結合ポイントのセットを作成できます。ポイントカットは、通常の集合理論の方法で結合、補完、および交差できます。他のポイントカットは、変数の値/タイプ(たとえば、「xが正の場合のみ」、「設定されている値がこのタイプのサブクラスである場合のみ」)およびプログラムの状態(「このメソッドは呼び出されますが、この他のメソッドがこのスレッドのスタック上にある場合のみです(つまり、そのメソッドが間接的に呼び出していることを意味します) ")。
これらのポイントカットのすべてがプログラムのイベントを記述したら、AspectJを使用してこれらのイベントをアドバイスできます。イベントが発生する前(before
アドバイス)、イベントが発生した後(after
アドバイス)、またはイベントが発生する代わりに(アドバイス)のいずれかを選択できますaround
。
Around
アドバイスは、プログラムにキャッシュを追加する場合に特に役立ちます。何らかのメソッドが実行されると、同じ計算が既に実行されているかどうかをテーブルで調べ、実行されている場合はキャッシュバージョンを使用します。AspectJを使用すると、非常に軽量で表現力に優れているため、コード内の数百の異なるポイントでこのようなキャッシュ実験を実行して、キャッシュが値を追加するかどうかと場所を見つけることができます。
アスペクト指向プログラミング以外の多くの人々は、AOPの大部分は「ロギング」に関するものだと考えています。AspectJを使用してロギングを処理できます。これは非常にうまく機能します(「このパッケージのすべてのパブリックメソッドが呼び出されたときに、このログファイルに記録し、その結果/エラー結果を記録します」)。しかし、AspectJには、ワームホールパターンと呼ばれるダイナミックスコープをシミュレートするための巧妙なトリックがあります(スライド23以降を参照)。
AOP以外では、イベントベースのプログラミングについても話します。これには、[他の人が述べたように]オブザーバーパターンが含まれます。解決策の違いは次のとおりです。(1)条件の検出方法。(2)条件が表現されている場合。(3)実行するコードがイベントにどのようにバインドされているか。
Notify / Waitの使用方法はこれに近いと思われます。
Javaの待機/通知メカニズムは、本質的にスレッド間で通信する方法であると述べました。一言で言えば、アイデアは次のとおりです。
- 1つ以上のスレッドがシグナルを待機します。
- 別のスレッドが来て、待機中のスレッドに通知します(つまり、シグナルで「目を覚まします」)。
コンテキストに応じて、これに近い構造がいくつかありますが、質問を明確にする必要があります。
この要素は、一連のテストに基づいて1つのアクションコースを決定するために使用されます。各テストは要素内で実行されます。テストが成功すると、要素の本体が実行されます。テストが失敗しない場合、要素を使用してデフォルトのアクションを指定できます。
XSLTの「when」は条件文であり、ifよりもスイッチに似ています。ただし、最初の質問の「いつ」が意味するもののコンテキストは、あまり明確にされていませんでした。
私は、コンテンツを表示するために働いているSitecore CMSでXSLTを頻繁に使用しているため、場合によってはGUI環境で使用できます。
if
はif
、プログラミング言語で見られる手続き型ではありませんが、のように聞こえます。(私は、より一般的なプログラミング言語よりも、特定のデータ処理言語として多くのXSLTを表示-私はあなたがXSLTを使用して、デスクトップのGUIを構築表示されません)
あなたが求めているのは、リアクティブプログラミングと呼ばれるものです。
変数は割り当てられた式を認識し、式のコンポーネントが変更されるたびに変数が式を再評価することで反応するプログラミングのパラダイムであり、依存関係のチェーンで他の同様の再評価をトリガーする可能性があります。
通常、このリアクティブな動作は、オブザーバーパターンを巧妙に使用することで実現されます。この場合、リアクティブな値は、値の再評価をトリガーする一連のイベントのリスナーとして登録されます。
私の知る限り、コアにリアクティブプログラミングを完全に包含するプログラミング言語は存在しませんが、多くの言語にはリアクティブプログラミングの利点を何らかの形で提供するライブラリがたくさんあります。
データバインディングフレームワークのほとんどは、リアクティブプログラミングの実装と見なすことができます。
「オブザーバーパターンを非推奨にする」という素晴らしい論文があります。これはおそらく、私がこれまで以上によく説明し、リアクティブプログラミングとは何か、その実装は既存の手法に加えて何を提供しますか。
このような種類のステートメントは、エラー処理についてのみ知っています。たとえば、BASIC ON ERROR ...
またはSQL * PLUSWHENEVER SQLERROR ...
任意の条件の場合、条件が真になる正確な瞬間をキャッチするには、非常に賢いコンパイラーまたはかなり高価な種類のブルートフォース(ステートメントごとに確認)が必要です。
条件変数を探しているように聞こえます。これは、ある述語が真になるまでスレッドをスリープ状態にすることを可能にするものです。
ブースト C ++のための道具にそれらをApacheのポータブルランタイムあなたが使用したいC.でCommon Lispのための道具にそれらbordeaux-thread
のmake-condition-variable
。
Droolsを言語と考えるなら、はい。
例:
rule "Rule 08 - Debit"
when
AccountingPeriod( $start : start, $end : end )
$cashflow : AllocatedCashflow( $account : account, $date : date <= $end, $amount : amount, type==TypedCashflow.DEBIT )
not AccountingPeriod( start < $start)
then
$account.setBalance($account.getBalance()-$amount);
retract($cashflow);
end
Perl 6は、以下を使用して信号を直接処理できますtap
。
signal(SIGINT).tap: {
note "Took { now - INIT now } seconds.";
exit;
}
for 0, 1, *+* ... * {
sleep 0.5;
.say;
}
一方、Powershellはtry / finallyブロックで実行ループを使用して処理できます。
$Start_Time = (Get-date).second
Write-Host "Type CTRL-C to Terminate..."
$n = 1
Try
{
While($true)
{
Write-Host $n
$n ++
Start-Sleep -m 500
}
}
Finally
{
$End_Time = (Get-date).second
$Time_Diff = $End_Time - $Start_Time
Write-Host "Total time in seconds"$Time_Diff
}
を使用して期待できるようにtrap
:
package require Expect
proc sigint_handler {} {
puts "elapsed time: [expr {[clock seconds] - $::start_time}] seconds"
set ::looping false
}
trap sigint_handler SIGINT
set start_time [clock seconds]
set n 0
set looping true
while {$looping} {
puts [incr n]
after 500
}
参照資料
これらを見てから長い時間が経ちましたので、間違いを犯す可能性があります。
思い出すと、PL / IとBASICの両方に「ON」ステートメントがありました。PL / Iでは、コンセプトは「ON DO」でした。BASICでは、それは「ON」で、ステートメントは通常GOSUBでした。両方の言語で、指定された条件が真になるたびに、関連するステートメントが実行されました。
今日はこれをしたくないでしょう。コンパイラーは基本的に、条件がいつどこで真になるかを把握するために多くの作業を行う必要があるため、その時点でテストを生成できます。関連付けられたハンドラーに入ると、どこから来たのか本当に分からないので、何が起きてそこにたどり着いたのかを理解する必要があります。
あなたは見ているかもしれませんOPS5言語を。そのプログラムは一連の条件として書かれています。条件が満たされると、対応するアクションが実行されます。アクションは状態を変更でき、それにより他の条件が満たされる可能性があります。when
キーワードを使用しませんが、基本的には、条件が満たされたときにアクションを実行することで機能します。ここから:
OPS5プログラムは、基本的なデータ構造が定義されている宣言セクションと、それに続くデータ操作のルールが含まれる本番セクションで構成されています。
OPS5プログラムは、ワーキングメモリ要素を運用メモリのルールと照合し、一致する最も支配的なルールを実行(実行)することで実行されます。Match-Select-Executeサイクルは、プログラムが明示的に停止するまで、または作業メモリーに一致するルールがなくなるまで続きます。
90年代前半に大学にいたときに、この言語で簡単なテキストアドベンチャーを書く必要がありました。面白かったですが、ほとんどのデスクトップやモバイルのタスクにどれほど役立つかはわかりません。ただし、バックエンド環境では意味があります。
Haskellには1つあります。しかし、特別な構造ではなく、別の関数http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v: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コード検索を使用して「いつ」を検索します。