13

これは次の質問から始まりました。

ほとんどの場合、Erlang シェルを使用するときは、シェルの起動時に次のようなコマンドを実行したいと思います。

rr("*.hrl").

または類似。現在、Erlang シェルを起動するたびに入力する必要があり、飽きてしまい、いつも忘れてしまいます。

しかし、これは実際には間違った質問でした。私が実際にやりたかったことは、すべてのシェルジョブでレコード定義ヘッダーを読み取ることです。起動時に実行する他のシェル組み込みコマンドには使用しないでください。そこで、質問のヘッダーを変更して、質問がどのように尋ねられるべきかを示しました。

4

3 に答える 3

17

で解決策を試しているときに、特定の用途.erlangの解決策を見つけました。rr/1

シェルのマンページから:

シェルでのレコードの読み取りと印刷のサポートがいくつかあります。コンパイル中、レコード式はタプル式に変換されます。実行時には、タプルが実際にレコードを表しているかどうかはわかりません。また、コンパイラが使用するレコード定義も実行時に利用できません。したがって、可能な場合にレコード構文を読み取り、タプルをレコードとして出力するには、シェル自体でレコード定義を維持する必要があります。レコードの読み取り、定義、忘却、一覧表示、および印刷のためのシェル コマンドについては、以下で説明します。各ジョブには、独自の一連のレコード定義があることに注意してください。モジュール shell_default および user_default (ロードされている場合) 内のレコード定義を容易にするために、新しいジョブが開始されるたびに読み取られます。たとえば、次の行を追加します

  -include_lib("kernel/include/file.hrl").

を user_default に変更すると、file_info の定義がシェルですぐに使用できるようになります。

明確にするために、いくつかの例を追加します。

ファイルfoo.hrl:

-record(foo, {bar, baz=5}).

ファイル: user_default.erl:

-module(user_default).
-compile(export_all).

-include("foo.hrl").  % include all relevant record definition headers here

 %% more stuff probably ...

シェルで試してみましょう:

$ erl
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
1> #foo{}.
#foo{bar = undefined,baz = 5}

→ シェルはレコードを知っていますfoo.hrl

于 2010-11-01T20:01:44.117 に答える
3

ファイル.erlangはシェルの開始時に評価されますが、シェルのコンテキストでは評価されません。これは、シェルコマンドではなく、評価される一般的な式のみを含めることができることを意味します。残念ながらrr()、これはシェル コマンド (レコードを認識するためにローカル シェル データを初期化する) であるため、ファイル内では使用できません.erlang

プリロードする必要があるユーザー定義モジュールには、またはuser_defaultを使用したレコード定義を含むファイルを含めることができますが、これらのレコード定義は、 内で定義された関数でのみ使用できます。は通常のコンパイル済みモジュールであり、その中のエクスポートされた関数は他の関数として呼び出されるため、シェル内でレコード定義が表示されません。シェルコマンドとしてシェル内から呼び出すことができる、より複雑な関数をユーザーが定義できるようにします。-include-include_libuser_defaultuser_defaultuser_default

編集:

私はここで部分的に間違っていました。.erlangがどのように評価され、関数がどのように呼び出されるかについては正しかったのですが、シェルの起動時に がスキャンされ、シェル内で使用できるようになるレコード定義を取得user_defaultする方法を見逃していました。user_default.erlこれを指摘してくれた@Peer Stritzingerに感謝します。

于 2010-11-01T21:45:44.970 に答える
0

ホームディレクトリにあるファイルに配置します( http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html.erlangの段落 1.7.1 を参照)。

于 2010-11-01T19:28:31.130 に答える