2010-11-01 44 views
10

這開始作爲一個問題:幾乎每次在Erlang的外殼,我怎麼能自動讀取所有的記錄定義頁眉

當我使用Erlang的外殼,我想運行shell啓動一些命令,例如像

rr("*.hrl"). 

或類似。目前,我必須在每次啓動一個Erlang shell時輸入它,而且我已經厭倦了它並一直忘記它。

但是這實際上是錯誤的問題!對於我真正想要做的是在每個shell作業中讀取我的記錄定義頭文件。不能用於啓動時運行的其他shell內置命令。所以我改變了問題標題以顯示問題應該如何提出。

回答

13

嘗試與.erlang的解決方案,我在爲特定的RR/1功能的解決方案跌跌撞撞

有閱讀和打印一些支持記錄在shell中。 在編譯期間,記錄表達式被轉換爲元組表達式。在運行時,它不知道一個元組是否實際上代表一個 記錄。編譯器使用的記錄定義在 運行時也不可用。因此,如果可能的話,爲了讀取記錄語法和打印元組作爲 記錄,記錄定義必須由 外殼本身維護。下面描述了用於閱讀,定義,遺忘,列表和打印記錄的shell命令。請注意,每個作業 都有自己的一組記錄定義。爲了便於記錄, 定義在模塊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 ... 

讓我們嘗試在shell:

$ 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

0

將其放在您的主目錄中的名爲.erlang的文件中(請參閱http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html中的段落1.7.1)。

從外殼的手冊頁:

+0

對於RR的例子()我有困難,使這項工作。對於一個如果我只放線如上.erlang沒有找到RR/1陳述,我不知道是什麼模塊RR/1中定義的。在另一方面,我不知道這將是可用在所有殼工作。 – 2010-11-01 19:56:40

+1

@Peer Stritzinger:'rr()'沒有被定義爲一個函數;你可以在'stdlib/shell.erl'中找到它作爲'local_func/7'函數的一個子句。 – Zed 2010-11-01 20:55:50

+0

@Zed:是的,這是我的問題,我正在尋找一種方法來自動調用它。在我自己的答案中解決該變通方法,因爲我無法想到啓動時需要的任何其他shell內置僞函數,該解決方案爲我解決了該問題。 – 2010-11-01 21:30:32

2

當shell啓動文件.erlang評估記錄,但它是不外殼的背景下進行評估。這意味着它只能包含被評估的通用表達式而不包含shell命令。不幸的是rr()是一個shell命令(它初始化本地shell的數據來識別記錄),因此它不能在.erlang文件中使用。

儘管用戶定義的模塊user_default,其必須被預加載,可包括使用-include-include_lib含有記錄定義文件,這些記錄定義將僅提供給內user_default定義的函數。 user_default是正常編譯的模塊和它導出的函數調用任何其他功能,因此該記錄定義不會在殼體內可見。 user_default允許用戶定義更復雜的函數,這些函數可以在shell中作爲shell命令調用。

編輯:

我在這裏是部分錯誤。當我正要正確.erlang如何評估,如何在user_default功能被稱爲我錯過user_default.erl如何在shell啓動掃描記錄定義其隨後可在殼體內。感謝@Peer Stritzinger指出了這一點。

+0

你確定嗎?手冊頁中的文字似乎是另有說明。爲了檢查我設置了一個小測試用例(請參閱http://ideone.com/4Gau5)看起來它似乎工作。我錯過了什麼嗎? – 2010-11-01 22:31:12

+0

不,你沒有錯過任何東西。我正在檢查代碼,只看到'shell_default'和'user_default'中的函數的使用,並且在shell啓動時錯過了對它們的掃描。 Mea culpa。 – rvirding 2010-11-02 11:07:17