[Glue!] メッセージと標準入力からのコマンドとを受け付けるエージェント


Glue Logic を経由したメッセージと、標準入力から与えられたコマンドとの 内容にしたがって動作するエージェントのメイン・プログラムは、 たとえば以下のようになる:
#!/usr/local/bin/perl5

use GlueLogic;
&GlueLogicParseArgs();
&GlueLogicConnect("agent#", undef, "foobar");
&GlueLogicAccess("$GlueLogicAnchor.IN=UNBOUND", "$GlueLogicAnchor.OUT=UNBOUND");
&GlueLogicAccess("!AddInformTo $GlueLogicAnchor.IN $GlueLogicAgent/BINDING");

while (1){
    &GlueLogicWaitForMessage()
	unless ( @GlueLogicMessageQueue || @GlueLogicStdinQueue );
    &GlueLogicEnqueueMessage();

    if ( @GlueLogicMessageQueue ) {
	last unless defined ( $_ = shift(@GlueLogicMessageQueue) );
	next unless ( $_ eq "Changed $GlueLogicAnchor.IN" );
	( $_ ) = &GlueLogicAccess( "$GlueLogicAnchor.IN?" );
	( $vv, $v, $a ) = /^[^=]+=(.(\S+))\s*(.*)$/o;
	if ( $vv eq 'UNBOUND' ) {
	    &GlueLogicAccess( "$GlueLogicAnchor.OUT=UNBOUND" ); next;
	}
	$OUT = "Unknown Message Selector";
	if    ( $v eq 'a' )   { $OUT = &ProcessMessageA ($a); }
	elsif ( $v eq 'bb' )  { $OUT = &ProcessMessageBB($a); }
	elsif ( $v eq 'zzz' ) { last; }
	&GlueLogicAccess( "$GlueLogicAnchor.OUT=\"$OUT" );
    } elsif ( @GlueLogicStdinQueue ) {
	last unless defined ( $_ = shift(@GlueLogicStdinQueue) );
	next if /^\s*$/o;
	chop;
	( $v, $a ) = /^(\S+)\s*(.*)$/o;
	$OUT = "Unknown Command";
	if    ( $v eq 'a' )   { $OUT = &ProcessCommandA ($a); }
	elsif ( $v eq 'bb' )  { $OUT = &ProcessCommandBB($a); }
	elsif ( $v eq 'zzz' ) { last; }
	print $OUT, "\n";
    }
}

&GlueLogicAccess("!DelInformTo $GlueLogicAnchor.IN $GlueLogicAgent/BINDING");
&GlueLogicDisconnect();
exit 0;


標準入力からの入力行の処理

関数 GlueLogicWaitForMessageGlueLogicEnqueueMessage は 変更通知メッセージと標準入力からの入力行とを全く対称的に取り扱う。
すなわち、関数 GlueLogicWaitForMessage は 変更通知メッセージか標準入力からの入力行かのどちらかが来るまで待ち合わせを行ない、 関数 GlueLogicEnqueueMessage はその時に到着している 変更通知メッセージを @GlueLogicMessageQueue に、 標準入力からの入力行を @GlueLogicStdinQueue に取り込む。

標準入力からの入力行は、行末の改行文字を取り除かれないまま、 待ち行列 @GlueLogicStdinQueue に入れられる。 このため、空行が入力された場合でも、その要素の長さが 0 になることはない。

last unless defined ( $_ = shift(@GlueLogicStdinQueue) );
last unless defined ( $_ = shift(@GlueLogicMessageQueue) );
と全く同様(あるいは対称)で、 @GlueLogicStdinQueue 内の先頭の要素が undef であったら、 それは標準入力が close されたことを示すという規約に基づいている。 ここではどちらの場合も、エージェントの停止を示すとしている。


 [M.T. HomePage]  [written & copyrighted by Masayuki Takata]