Подтвердить что ты не робот

В оболочке Erlang, как я могу автоматически считывать все заголовки определения записи

Это началось с вопроса:

Почти каждый раз, когда я использую оболочку Erlang, я бы хотел запустить некоторую команду при запуске оболочки, например. что-то вроде

rr("*.hrl").

Или аналогично. В настоящее время я должен вводить его каждый раз, когда я запускаю оболочку Erlang, и я устаю от нее и все время забываю.

Но это был действительно неправильный вопрос! Для того, что я действительно хотел сделать, это прочитать мои заголовки определения записи в каждой задаче оболочки. Не использовать для других встроенных команд оболочки для запуска при запуске. Поэтому я изменил заголовок вопроса, чтобы показать вопрос, как он должен был задаваться.

4b9b3361

Ответ 1

При попытке решения с .erlang я наткнулся на решение для конкретного использования rr/1:

Из man-страницы оболочки:

Существует некоторая поддержка чтения и печати записей в оболочке.       Во время компиляции записи выражений переводятся в кортеж expres-       рений. Во время выполнения неизвестно, действительно ли кортеж представляет собой       запись. Также не используются определения записи, используемые компилятором в       во время выполнения. Поэтому, чтобы прочитать синтаксис записи и печатать кортежи как       записи, когда это возможно, определения записей должны поддерживаться       сама оболочка. Команды оболочки для чтения, определения, забывания,       листинга и печати, описаны ниже. Обратите внимание, что каждое задание       имеет собственный набор определений записей. Чтобы облегчить запись       определения в модулях 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

Ответ 2

Файл .erlang оценивается при запуске оболочки, но он оценивается NOT в контексте оболочки. Это означает, что он может содержать только общие выражения, которые оцениваются, а не команды оболочки. К сожалению, rr() - это команда оболочки (она инициализирует данные локальной оболочки для распознавания записей), поэтому она не может использоваться в файле .erlang.

В то время как пользовательский модуль user_default, который должен быть предварительно загружен, может включать файлы, содержащие определения записи с использованием -include или -include_lib, эти определения записей будут доступны только для функций, определенных в user_default. user_default - обычный скомпилированный модуль, а экспортируемые в нем функции называются любыми другими функциями, поэтому определения записи не будут видны внутри оболочки. user_default позволяет пользователю определять более сложные функции, которые могут быть вызваны из оболочки в виде команд оболочки.

EDIT:

Я был здесь частично не прав. Хотя я был прав о том, как оценивается .erlang и как вызываются функции из user_default, я пропустил, как user_default.erl сканируется при запуске оболочки для определений записей, которые затем доступны в оболочке. Спасибо @Peer Stritzinger за это.