Как в оболочке Erlang автоматически читать все заголовки определений моих записей - PullRequest
11 голосов
/ 01 ноября 2010

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

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

rr("*.hrl").

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

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

Ответы [ 3 ]

14 голосов
/ 01 ноября 2010

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

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

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

& rarr; оболочка знает о записи из foo.hrl

2 голосов
/ 02 ноября 2010

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

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

EDIT:

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

0 голосов
/ 01 ноября 2010

Поместите его в файл с именем .erlang в вашем домашнем каталоге (см. Пункт 1.7.1 в http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html).

...