2013-04-27 2 views
4

В каком формате epp:parse_file/3 принимают предопределенные макросы?Как использовать пользовательские макросы в препроцессоре Erlang?

Документах немного не хватает на это:

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)())). 

Что мне нужно передать в качестве третьего аргумента epp:parse_file?

ответ

3

Функция epp:parse_file/3 препроцессов и анализирует исходный файл Erlang. Для предварительной обработки ему требуется все макроопределение. Возможны 3 возможности.

  1. Макрос может быть определен в том же файле или файл hrl, где он определен, включен в полный путь. В этом случае он автоматически решает то же самое.
  2. Макрос может быть определен в файле hrl. Затем каталоги включенных файлов могут быть указаны во втором аргументе. Пример: epp:parse_file("test.erl", ["../include"], []). Он ищет все файлы в каталоге и разрешает его.
  3. Макрос не может быть определен (или вы можете не захотеть его искать в каталогах include). Это приведет к ошибке в форме. Например

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

В этом случае вы можете указать его в самой функции parse_file. Например

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

Это решит макрос.

Итак, если у вас есть макрос в исходном файле, вам не нужно его отправлять. Только если его нет в источнике или в include (или не хотите указывать каталог), вы можете указать его в функции

Примечание: вы можете отправить, даже если у вас есть это в исходном файле. Но в абстрактной форме будет набор {error, redefine, 'YOURSERVER'}. Но он будет переопределяться во всех местах со значением, отправленным в функцию.

Edit:

Из анализа кода ПОП я обнаружил, что в настоящее время не представляется возможным дать arguments.The модуль Эпп не может обрабатывать сложные типы макросов. Пропускная структура функции невозможна в текущем режиме.

Я изменил файл epp, чтобы обработать этот случай. Вы можете проверить это link, если вы в порядке, чтобы изменить файл epp (добавлено только 3 строки).

+0

Извините, я не был в курсе моего вопроса. Я понимаю, что могу сделать это для простых макросов, но я не знаю, как это сделать с макросами, которые принимают аргументы. Я обновил его сейчас. –

+0

У вас возникли вопросы. Я обновил свой ответ. – Vinod

+0

Удивительный, спасибо! Я думал, что это может быть так - теперь я точно знаю :) –

Смежные вопросы