これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド perlmroapi です。
プログラム:
NAME
perlmroapi - Perl メソッド解決プラグイン インターフェイス
DESCRIPTION
Perl 5.10.1 では、メソッド解決命令をプラグインして使用するための新しいインターフェースが追加されました。
デフォルト (線形深さ優先検索) 以外。 C3 メソッドの解決順序が追加されました
5.10.0 では、Perl 空間インターフェイスを変更せずに、プラグインとして再実装されました。
各プラグインは、次の構造を提供してそれ自体を登録する必要があります。
構造体 mro_alg {
AV *(*解決)(pTHX_ HV *スタッシュ、U32 レベル);
const char * name;
U16の長さ。
U16 kflags;
U32 ハッシュ。
};
そして「Perl_mro_register」を呼び出します。
Perl_mro_register(aTHX_ &my_mro_alg);
解決する
以下で説明する線形化関数へのポインタ。
名
ISO-8859-1 または UTF-8 の MRO の名前。
長さ
名前の長さ。
kflags
名前が UTF-8 で指定されている場合は、これを「HVhek_UTF8」に設定します。 値は次のように直接渡されます。
パラメータ kflags 「hv_common()」に。
ハッシュ
MRO の名前の事前計算されたハッシュ値、または 0。
コールバック
「resolve」関数は、指定されたスタッシュに対して線形化された ISA を生成するために呼び出されます。
このMRO。 これはスタッシュへのポインターを使用して呼び出されます。 レベル 0 のコアは常に設定されます。
レベル 関数を呼び出すときに 0 に設定します。このパラメーターは、関数を呼び出すときに提供されます。
再帰する必要がある場合に深さを追跡するための実装。
この関数は、親クラスを含む配列への参照を順番に返す必要があります。
クラスの名前は、スタッシュ上で「HvENAME()」を呼び出した結果である必要があります。 で
「HvENAME()」が null を返す場合は、代わりに「HvNAME()」を使用する必要があります。
呼び出し元は、返された配列の参照カウントをインクリメントする責任があります。
構造を維持したいと考えています。 したがって、一時的な値を作成した場合は、何も保持しないでください。
「sv_2mortal()」へのポインタが正しく破棄されていることを確認します。 キャッシュしてある場合
戻り値を指定したら、参照カウントを変更せずにその値へのポインタを返します。
キャッシング
MRO の計算にはコストがかかる場合があります。 実装ではキャッシュが提供されます。
単一の「SV *」、または「AV *」などの「SV *」にキャストできるものを格納します。 読むには
プライベート値を使用するには、マクロ「MRO_GET_PRIVATE_DATA()」を使用し、「mro_meta」を渡します。
スタッシュからの構造体と、「mro_alg」構造体へのポインター。
メタ = HvMROMETA(隠し場所);
private_sv = MRO_GET_PRIVATE_DATA(meta, &my_mro_alg);
プライベート値を設定するには、「Perl_mro_set_private_data()」を呼び出します。
Perl_mro_set_private_data(aTHX_ メタ、&c3_alg、private_sv);
プライベート データ キャッシュは、ほぼ同じ方法で、private_sv への参照の所有権を取得します。
その「hv_store()」は、渡された値への参照の所有権を取得します。
例
MRO 実装の例については、「S_mro_get_linear_isa_c3()」および「BOOT:」を参照してください。
のセクション mro/mro.xs、および「S_mro_get_linear_isa_dfs()」 ミスターシー
作者
Perl コア内の C3 MRO および切り替え可能な MRO の実装は、次のように作成されました。
ブランドン・L・ブラック。 Nicholas Clark は、Brandon のインターフェースをリファクタリングして、プラグ可能なインターフェースを作成しました。
それを使用して動作する実装を開発し、このドキュメントを作成しました。
onworks.net サービスを使用してオンラインで perlmroapi を使用する