這開始作爲一個問題:幾乎每次在Erlang的外殼,我怎麼能自動讀取所有的記錄定義頁眉
當我使用Erlang的外殼,我想運行shell啓動一些命令,例如像
rr("*.hrl").
或類似。目前,我必須在每次啓動一個Erlang shell時輸入它,而且我已經厭倦了它並一直忘記它。
但是這實際上是錯誤的問題!對於我真正想要做的是在每個shell作業中讀取我的記錄定義頭文件。不能用於啓動時運行的其他shell內置命令。所以我改變了問題標題以顯示問題應該如何提出。
這開始作爲一個問題:幾乎每次在Erlang的外殼,我怎麼能自動讀取所有的記錄定義頁眉
當我使用Erlang的外殼,我想運行shell啓動一些命令,例如像
rr("*.hrl").
或類似。目前,我必須在每次啓動一個Erlang shell時輸入它,而且我已經厭倦了它並一直忘記它。
但是這實際上是錯誤的問題!對於我真正想要做的是在每個shell作業中讀取我的記錄定義頭文件。不能用於啓動時運行的其他shell內置命令。所以我改變了問題標題以顯示問題應該如何提出。
嘗試與.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
將其放在您的主目錄中的名爲.erlang
的文件中(請參閱http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html中的段落1.7.1)。
從外殼的手冊頁:
當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指出了這一點。
你確定嗎?手冊頁中的文字似乎是另有說明。爲了檢查我設置了一個小測試用例(請參閱http://ideone.com/4Gau5)看起來它似乎工作。我錯過了什麼嗎? – 2010-11-01 22:31:12
不,你沒有錯過任何東西。我正在檢查代碼,只看到'shell_default'和'user_default'中的函數的使用,並且在shell啓動時錯過了對它們的掃描。 Mea culpa。 – rvirding 2010-11-02 11:07:17
對於RR的例子()我有困難,使這項工作。對於一個如果我只放線如上.erlang沒有找到RR/1陳述,我不知道是什麼模塊RR/1中定義的。在另一方面,我不知道這將是可用在所有殼工作。 – 2010-11-01 19:56:40
@Peer Stritzinger:'rr()'沒有被定義爲一個函數;你可以在'stdlib/shell.erl'中找到它作爲'local_func/7'函數的一個子句。 – Zed 2010-11-01 20:55:50
@Zed:是的,這是我的問題,我正在尋找一種方法來自動調用它。在我自己的答案中解決該變通方法,因爲我無法想到啓動時需要的任何其他shell內置僞函數,該解決方案爲我解決了該問題。 – 2010-11-01 21:30:32