Это началось с вопроса:
Почти каждый раз, когда я использую оболочку Erlang, я бы хотел запустить некоторую команду при запуске оболочки, например. что-то вроде
rr("*.hrl").
Или аналогично. В настоящее время я должен вводить его каждый раз, когда я запускаю оболочку Erlang, и я устаю от нее и все время забываю.
Но это был действительно неправильный вопрос! Для того, что я действительно хотел сделать, это прочитать мои заголовки определения записи в каждой задаче оболочки. Не использовать для других встроенных команд оболочки для запуска при запуске. Поэтому я изменил заголовок вопроса, чтобы показать вопрос, как он должен был задаваться.
Ответ 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 за это.
Ответ 3
Поместите его в файл с именем .erlang
в вашем домашнем каталоге (см. пункт 1.7.1 в http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html).