No shell Erlang, como posso ler automaticamente todos os meus cabeçalhos de definição de registro

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

  •  28-09-2019
  •  | 
  •  

Pergunta

Isso começou como a pergunta:

Quase toda vez que eu uso o shell Erlang, eu gostaria de executar algum comando na startp start, por exemplo, algo como

rr("*.hrl").

Ou similar. Atualmente, tenho que digitá -lo toda vez que inicio uma concha de Erlang e estou cansando disso e esquecendo isso o tempo todo.

Mas Esta era realmente a pergunta errada! Pois o que eu realmente queria fazer é ler meus cabeçalhos de definição de registro em todos os trabalhos de shell. Não use para outros comandos internos do shell para executar na inicialização. Então, mudei o cabeçalho da pergunta para mostrar a pergunta como ela deveria ter feito.

Foi útil?

Solução

Enquanto tentava a solução com .erlang, tropecei em uma solução para o uso específico de RR/1:

Da página do homem da concha:

Há algum suporte para leitura e impressão de registros no shell. Durante as expressões de registro de compilação, são traduzidas para expressões de tupla. Em tempo de execução, não se sabe se uma tupla realmente representa um registro. As definições de registro também não são usadas pelo compilador disponíveis no tempo de execução. Portanto, para ler a sintaxe do registro e imprimir tuplas como registros, quando possível, as definições de registro devem ser mantidas pelo próprio shell. Os comandos do shell para leitura, definição, esquecimento, listagem e impressão registros são descritos abaixo. Observe que cada trabalho tem seu próprio conjunto de definições de registro. Para facilitar os assuntos, as definições de registro nos módulos shell_default e user_default (se carregadas) são lidas toda vez que um novo trabalho for iniciado. Por exemplo, adicionando a linha

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

para user_default disponibiliza a definição de File_info prontamente no shell.

Para esclarecimentos, adiciono algum exemplo:

Arquivo foo.hrl:

-record(foo, {bar, baz=5}).

Arquivo: user_default.erl:

-module(user_default).
-compile(export_all).

-include("foo.hrl").  % include all relevant record definition headers here

 %% more stuff probably ...

Vamos experimentar na concha:

$ 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}

→ O shell sabe sobre o registro de foo.hrl

Outras dicas

O arquivo .erlang é avaliado quando a concha é iniciada, mas é NÃO avaliado no contexto da concha. Isso significa que ele pode conter apenas expressões gerais que são avaliadas e não comandos de shell. Infelizmente rr() é um comando shell (ele inicializa dados da shell local para reconhecer registros) para que não possa ser usado no .erlang Arquivo.

Enquanto o módulo definido pelo usuário user_default, que deve ser pré -carregado, pode incluir arquivos que contêm definições de registro usando -include ou -include_lib, essas definições de registro estarão disponíveis apenas para funções definidas em user_default. user_default é o módulo compilado normal e as funções exportadas são chamadas de outras funções, para que as definições de registro não sejam visíveis no shell. user_default Permite que o usuário defina funções mais complexas que podem ser chamadas de dentro do shell como comandos do shell.

EDITAR:

Eu estava parcialmente errado aqui. Enquanto eu estava certo sobre como .erlang é avaliado e como as funções em user_default são chamados, eu perdi como user_default.erl é digitalizado no shell inicialmente para definições de registro que estão disponíveis no shell. Obrigado @peer stritzinger por apontar isso.

Coloque -o em arquivo chamado .erlang no seu diretório doméstico (consulte o parágrafo 1.7.1 em http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top