補足:
『&fml4;と &fml8; のコードの書き方はどのくらい違うか?』
コマンドの典型である『ファイルを送り返す』だけの
help コマンドを例にとり、
相違点を説明しましょう。
&fml4; では、適当な関数、たとえば myProcHelpFileSendBack を作り、
%LocalProcedure に書いておきます。
%LocalProcedure = (
'help', 'myProcHelpFileSendBack',
);
myProcHelpFileSendBack をあえて書き下すと、つぎのようなものでしょう。
sub myProcHelpFileSendBack
{
local($proc, *Fld, *e, *misc) = @_;
my $UJA_FILE = "/some/where/help";
&SendFile($Envelope{'Addr2Reply:'}, "UJA $ML_FN", $UJA_FILE);
}
&fml8; では help ファイルを送り返すコードの実体は
FML::Command::User::help にあり、
FML::Process::Command クラスから
(FML::Command の AUTOLOAD を経由して)呼び出されます。
全てのコマンドは FML::Command::User::コマンドもしくは
FML::Command::Admin::コマンドクラスとして実装されています。なお
makefml や CGI は FML::Command::Admin::コマンド を使います。コマンドメー
ルは User や Admin を権限に応じて適宜使い分けます。
help コマンドの実体は FML::Command::User::help の process() 関数です。
sub process
{
my ($self, $curproc, $optargs) = @_;
my $config = $curproc->{ config };
my $charset = $config->{ report_mail_charset_ja };
my $help_file = $config->{ help_file };
# template substitution: kanji code, $varname expansion et. al.
my $params = {
src => $help_file,
charset_out => $charset,
};
my $help_template = $curproc->prepare_file_to_return( $params );
if (-f $help_template) {
$curproc->reply_message( {
type => "text/plain; charset=$charset",
path => $help_template,
filename => "help",
disposition => "help",
});
}
else {
croak("no help file ($help_template)\n");
}
}
ここで $curproc はハッシュリファレンスで、&fml4; の %Envelope におおむ
ね相当します。名前の通り、UNIX カーネルでおなじみの current process 構
造体へのポインタのようなもので、プロセスに関連するいろいろなデータ構造
やオブジェクトへのリファレンスを含んでいます。
変数ですが、&fml4; ではグローバル変数群です。一方 &fml8; では $config
オブジェクトを通じてアクセスできる設定変数空間の中にあります。
prepare_file_to_return() はメッセージテンプレートの中にある変数の展開
や文字コード変換を適宜行ないます。
$curproc->reply_message() は引数によって振舞いがことなりますが、
いずれにせよ、メッセージをキューに入れるメソッドです。
キューに入れられたメッセージ群は、プロセスの終了直前に受信者ごとにメッ
セージはまとめられ一通のメールとして組み立てなおされ、Mail::Delivery
クラス経由で送信されます。メッセージキューの種類がファイルとメッセージ
が混在していれば、適宜 MIME マルチパートのメッセージが生成されます。
この仕組みは &fml4; の Notify() と同様ですが、あらゆるメッセージがキュー
に入れられ、最後に一気に処理されるという点で大きく異なります。
なお get コマンドなども同じキューイングの仕組みを使っています。つまり
&fml4; の Notify() 相当部分が(通常の記事配送以外の)あらゆる送信機能を
担当するということです。この点において、送信のキューイングのメカニズム
は &fml4; と大きく異なっています。