4

epp:parse_file/3定義済みマクロはどのような形式で取得されますか?

ドキュメントにはこれが少し欠けています:

PredefMacros = macros()  

macros() = [{atom(), term()}]

私はこれを行うことができる単純なマクロを理解しています:

epp:parse_file("code.erl", [], [{DEBUG, 0}]).

しかし、引数を取る複雑なマクロはどうでしょうか? このマクロがあるとします:

-define(DEBUG(Arg1, Arg2),
    ((fun () ->
      io:format("~p ~p~n", [Arg1, Arg2])
    end)())).

の 3 番目の引数として何を渡す必要がありepp:parse_fileますか?

4

1 に答える 1

3

epp :parse_file/3関数は、Erlang ソース ファイルを前処理して解析します。前処理には、すべてのマクロ定義が必要です。3 つの可能性があります。

  1. マクロは、同じファイルで定義するか、マクロが定義されている hrl ファイルに完全なパスを含めて定義できます。この場合、自動的に同じものを解決します。
  2. マクロは、hrl ファイルで定義できます。次に、インクルード ファイルのディレクトリを第 2 引数で指定できます。例:epp:parse_file("test.erl", ["../include"], []).ディレクトリ内のすべてのファイルを検索して解決します。
  3. マクロが定義されていない可能性があります (または、インクルード ディレクトリで検索したくない場合があります)。これにより、フォームにエラーが発生します。例えば

{error,{21,epp,{undefined,'YOURSERVER',none}}},

この場合、parse_file 関数自体で指定できます。例えば

epp:parse_file("yaws.erl", [], [{'YOURSERVER',yourserver}]).

これにより、マクロが解決されます。

したがって、ソース ファイルにマクロがある場合は、送信する必要はありません。ソースまたはインクルードにない(またはディレクトリを指定したくない)場合にのみ、関数で指定できます

注: ソースファイルに含まれていても送信できます。{error, redefine, 'YOURSERVER'}しかし、抽象形式にはタプルがあります。ただし、関数で送信された値ですべての場所でオーバーライドされます。

編集:

epp のコード分析から、現在引数を与えることができないことがわかりました。epp モジュールは複雑なマクロ タイプを処理できません。現在の方法では、Function 構造体を渡すことはできません。

このケースを処理するために epp ファイルを変更しました。変更された epp ファイル (3 行のみ追加) を使用してもよい場合は、このリンクを確認できます。

于 2013-04-27T14:01:33.543 に答える