Erlangシェルでは、すべてのレコード定義ヘッダーを自動的に読み取るにはどうすればよいですか
-
28-09-2019 - |
質問
これは質問として始まりました:
Erlang Shellを使用するほぼ毎回、シェルスタートアップでコマンドを実行したいと思います。
rr("*.hrl").
または類似。現在、Erlangシェルを開始するたびに入力する必要がありますが、疲れて常に忘れています。
だが これは実際には間違った質問でした!私が実際にやりたかったのは、すべてのシェルジョブで私のレコード定義ヘッダーを読むことです。スタートアップで実行するために他のシェルビルトインコマンドを使用しないでください。そこで、質問ヘッダーを変更して、どのように尋ねるべきかという質問を示しました。
解決
.erlangで解決策を試している間、私は特定のRR/1の使用法の解決策につまずきました。
シェルのマンページから:
シェルに記録を読んだり印刷したりすることには、いくつかのサポートがあります。編集中に記録的な表現は、タプルの表現に翻訳されます。ランタイムでは、タプルが実際にレコードを表すかどうかは不明です。また、コンパイラが使用するレコード定義は、実行時に使用できません。したがって、レコードの構文を読み取り、タプルを記録として読み取るには、可能な場合は、シェル自体によってレコード定義を維持する必要があります。読み取り、定義、忘却、リスト、および印刷記録のシェルコマンドを以下に説明します。各ジョブには独自のレコード定義セットがあることに注意してください。問題を容易にするために、モジュールで定義を記録するために、shell_defaultとuser_default(ロードされた場合)は、新しいジョブが開始されるたびに読み取られます。たとえば、行を追加します
-include_lib("kernel/include/file.hrl").
to 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のレコードについて知っています
他のヒント
ファイル .erlang
シェルが開始されたときに評価されますが、 いいえ シェルのコンテキストで評価されます。これは、シェルコマンドではなく評価される一般的な式のみを含めることができることを意味します。不運にも rr()
シェルコマンドです(レコードを認識するためにローカルシェルデータを初期化します)。 .erlang
ファイル。
ユーザー定義モジュール user_default
, 、プリロードする必要があり、レコード定義を含むファイルを含めることができます -include
また -include_lib
, 、これらのレコード定義は、中に定義された関数にのみ利用可能になります user_default
. user_default
通常のコンパイルされたモジュールとエクスポートされた関数は、他の関数と呼ばれるため、レコード定義はシェル内に表示されません。 user_default
ユーザーは、シェル内からシェルコマンドとして呼び出すことができるより複雑な関数を定義できます。
編集:
私はここで部分的に間違っていました。私はその方法について正しかったが .erlang
評価され、機能がどのように機能しますか user_default
私は方法を逃したと呼ばれています user_default.erl
シェルの定義のためにシェルスタートアップでスキャンされ、その後、シェル内で使用できます。これを指摘してくれた@peer stritzingerに感謝します。
電話と呼ばれるファイルに配置します .erlang
ホームディレクトリで(1.7.1段落を参照してください http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html).