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

StackOverflow https://stackoverflow.com/questions/4071788

  •  28-09-2019
  •  | 
  •  

Вопрос

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

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

rr("*.hrl").

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

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

Это было полезно?

Решение

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

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

Существует некоторая поддержка для чтения и печати записей в оболочке. Во время компиляции рекордные выражения переводятся на TUPLE EXPRESIONS. Во время выполнения неизвестно, представляет ли кортеж фактически запись. Определения записи не используются компилятором, доступными во время выполнения. Таким образом, для того, чтобы прочитать рекордные синтаксис и печатающие кортежи как записи, когда это возможно, определения записи должны поддерживаться самой оболочкой. Команды оболочки для чтения, определения, забывания, списка и записей печати описаны ниже. Обратите внимание, что каждая работа имеет свой набор определений записи. Чтобы облегчить определения рекордных определений в модулях Shell_default и user_default (если загружены) читаются каждый раз, когда начинается новая задача. Например, добавление линии

  -include_lib("kernel/include/file.hrl").

Для 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

Другие советы

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

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

РЕДАКТИРОВАТЬ:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top