6

mochiweb のソース コードを調べていて、今まで使ったことのないものを見つけました。特にmochiweb http ライブラリにあるmochiweb_requestおよびモジュールのモジュール宣言。mochiweb_responseモジュールの開始方法は次のとおりです。

-module(mochiweb_request,[ソケット、メソッド、RawPath、バージョン、ヘッダー])。
-著者(...)。

次に、モジュールに「get(socket) -> Socket;get(method)-> Method; ....
これは私を混乱させました」と表示されます。これらのモジュールの 1 つのモジュール情報を取得しようとしたとき、コンパイラは何かを追加していました:{abstract,true}への戻り値
mochiweb_request:module_info().。実際、彼らのドキュメントでは、これらのモジュールを として参照していますabstract modules

私はグーグルを検索し、パラメータ化されたモジュールに関する論文を見つけました。リンクは非常に大きいですが、ここをフォローすれば論文を入手できると確信しています

これらのモジュールは直接呼び出すことはできませんが、それら自体のインスタンスを介して呼び出されます。モジュールが楽しいものであるかのように動作します。これはランタイム システムの非公式な機能であることがわかりました。私を混乱させているのは、mochiweb の連中がそれをうまく使っているということです!. mochiweb モジュールでは、自分で書いたものを見つけることができます:

loop(必須、_DocRoot)->
    "/" ++ パス = Req:get_path(),
    本文 = Req:recv_body(),
    メソッド = Req:get(メソッド)、
    ...、
    ....、
    Response = Req:ok({"text.html;charset=utf-8",[],chunked}),
    Response:write_chunk("ここに何かテキストがあります....."),
    ...

io:format("\n\t Req = ~p~n",[Req])複雑なデータ構造 (タプル)を明らかにしようとすると、 element(1,Req) == mochiweb_request. それは面白いです!?!!!?

質問 1: 今のところ本番環境で使用するのに安定していますか、それとも公式になるまで待つことができますか?

質問 2: mochiweb の連中は、まだ公式でない場合、どのようにしてそれを使用する自信を得たのですか?

質問 3: なぜまだ公式ではないのですか? (なぜなら、それはいくつかのオブジェクト指向の機能をもたらすからです)

質問 4: それを使ったことのある人はいますか? どのような場合に、これらのパラメータ化されたモジュールを使用しましたか? なんで?この機能の詳細を確認できるように、ソース コードへのリンクを表示または投稿する場所を教えてもらえますか?

最後の質問: Erlang ドキュメントのどこにも、この機能について言及されている場所はありませんでした。教科書も家もない. では、それを使用したことがある人は、どのようにして、それを使用する理由と方法をすでに見つけたのでしょうか? ここにあるErlangランタイムシステムの商用バージョンにはすでに含まれていますか?

4

2 に答える 2

4

質問 1: 今のところ本番環境で使用するのに安定していますか、それとも公式になるまで待つことができますか?

R16B で削除されました。READMEから:

OTP-10616 実験的な機能「パラメータ化されたモジュール」(「抽象モジュール」とも呼ばれる) が削除されました。パラメーター化されたモジュールに依存するアプリケーションの場合、パラメーター化されたモジュールを引き続き使用するために使用できる解析変換があります。解析変換は、http: //github.com/erlang/pmod_transformにあります。

質問 2: mochiweb の連中は、まだ公式でない場合、どのようにしてそれを使用する自信を得たのですか?

パラメータ化されたモジュールの使用は、リリース 2.4.0から Mochiweb から削除されましたが、以前のパラメータ化されたモジュールへの呼び出しは同じように見えますが、パラメーター化されたモジュール (タプル モジュール) の実装メカニズムは、下位互換性のために保持されているためです。タプル呼び出しのサポートはErlang/OTP 21.0でコンパイラから削除されましたが:

OTP-14497 アプリケーション: コンパイラ、erts

*潜在的な非互換性*

「タプル呼び出し」のサポートは、ランタイム システムから削除されました。タプル呼び出しは、適用操作のモジュール引数をタプルにすることができる、文書化されておらず、サポートされていない機能でした: Var = dict:new(), Var:size(). この「機能」は、特にそのような呼び出しが失敗した場合に、しばしば混乱を引き起こしました。スタック トレースは、ソース コードに存在しない関数を指摘します。

何らかの理由でパラメーター化されたモジュールまたはタプル呼び出しを使用する必要があるレガシー コード用に、 と呼ばれる新しいコンパイラ オプションがありますtuple_calls。このオプションを指定すると、コンパイラは、モジュールが変数である呼び出しの古い動作をエミュレートする追加のコードを生成します。

Mochiwebは、tuple_callsこのタイプのコードのコンパイラ オプションを使用して動作し続けるようになりました。

質問 3: なぜまだ公式ではないのですか? (私にとっては、オブジェクト指向の機能がいくつか含まれているためです)

2012 年 10 月 16 日付のパラメータ化されたモジュールの終了を発表する技術委員会の決定から:

理事会は、常に実験的な機能ですが、多くのソフトウェアがこの機能に依存していることを認めています。実装の現在の形式は受け入れられず、パラメーター化されたモジュール自体は言語の機能として受け入れられていません。この機能は、たとえば module-fun の機能とも互換性がなく、OTP の残りのツールと完全に統合されていません。

于 2013-06-06T13:05:31.637 に答える
3

質問 1: 今のところ本番環境で使用するのに安定していますか、それとも公式になるまで待つことができますか?

プロダクションでの使用には非常に安定しており、しばらく前から使用されています。これは公式規格の一部ではありません。

質問 2: mochiweb の連中は、まだ公式でない場合、どのようにしてそれを使用する自信を得たのですか?

これについては、mochiweb 担当者に問い合わせる必要があります。おそらく、引っ張られればすぐに変更できると信じているのでしょう。

質問 3: なぜまだ公式ではないのですか? (私にとっては、オブジェクト指向の機能がいくつか含まれているためです)

それは論争が散らばっているからです。それが言語にどのような利点をもたらし、どのように作業を容易にするかは明らかではないため、P. モジュールには支持者と反対者がいます。したがって、現在の観点では、これは実装の一部であるため、人々はそれを試してみて、コードの読み書きが容易になると感じるかどうかを確認できます。非公式ということは、非推奨にならずにプルできることを意味し、Erlang の連中はその権利を留保しているようです。

個人的な偏見:私はそれが好きですが、Erlang に OOP 機能を組み込むためにそれを使用することはありません。OOP は、これまでプログラミングの場を持たない、まったくがらくたの醜い巨獣です。プログラムが根底から腐敗し、ゾンビのように歩き回り、狂ってしまうまで、プログラムを悩ませるのは単なる惨めさです。その時点で唯一の解決策はショットガンです。むしろ、私はこれを ML スタイルのファンクターとして使用したいと考えています。これはより静的であり、Erlang のイディオムによりよく一致していると感じています。

最後の質問: Erlang ドキュメントのどこにも、この機能について言及されている場所はありませんでした。教科書もなく、家にもありません。では、それを使用したことがある人は、どのようにして、それを使用する理由と方法をすでに見つけたのでしょうか? ここにあるErlangランタイムシステムの商用バージョンにはすでに含まれていますか?

著者は、数年前の Erlang カンファレンスでこのことを発表しました。それ以来、口コミなどの組み合わせでした。

于 2011-03-17T19:30:31.630 に答える