Erlang: используя include из консоли? - PullRequest
8 голосов
/ 17 сентября 2010

Директива include обычно используется для файла .hrl в начале файла .erl.

Но я бы хотел использовать include из консоли Erlang напрямую.

Я пытаюсь использовать некоторые функции в модуле.Я скомпилировал файл erl из консоли.Но функции, которые я хочу использовать, не работают без доступа к файлу hrl.

Есть предложения?

Ответы [ 3 ]

9 голосов
/ 20 сентября 2010

"Но функции, которые я хочу использовать, не работают без доступа к файлу hrl."

Это не может быть правдой, но из этого я сделаю попытку предположить, что вам нужен доступ к записям в файле hrl, которых у вас (обычно) нет в оболочке.

Если вы сделаете rr(MODULE), вы загрузите все записи, определенные в MODULE (включая записи, определенные во включаемом файле, включенном MODULE).

Тогда вы можете делать все, что вам нужно, из оболочки.

(Еще одна вещь, которую вы, возможно, захотите протестировать, - добавить строку -compile(export_all) в файл erl. Уродливо, но иногда полезно для тестирования.)

5 голосов
/ 17 сентября 2010

Вы пробовали вариант compile:file? Вы можете передать список модулей, которые будут включены таким образом:

compile:file("myfile.erl", [{i, "/path/1/"}, {i, "/path/2/"}])
2 голосов
/ 22 сентября 2010

Ничего не стоит, что jsonerl.hrl не содержит никаких функций. Содержит макросы. Насколько я знаю, макросы в Erlang используются только во время компиляции.

Самый простой способ сделать их доступными - создать сам файл .erl, который фактически объявляет функции, реализованные в терминах макроса. Может быть, что-то вроде этого:

-module(jsonerl_helpers).
-include("jsonerl.hrl").

record_to_struct_f(RecordName, Record) ->
    ?record_to_struct(RecordName, Record).

... который после компиляции вы можете назвать как:

jsonerl_helpers:record_to_struct_f(RecordName, Record)

Я не знаю, почему автор решил реализовать их как макросы; это кажется странным, но я уверен, что у него были свои причины.

...