[英]Parameterised Modules in Erlang
我正在瀏覽 mochiweb 源代碼,並看到了我以前從未使用過的東西。 模塊聲明,尤其是在 mochiweb http 庫中的mochiweb_request
和mochiweb_response
模塊中。 以下是該模塊的開始方式:
-module(mochiweb_request,[Socket, Method, RawPath, Version, Headers]). -author(...).
然后在模塊中你看到get(socket) -> Socket;get(method)-> Method; ....
get(socket) -> Socket;get(method)-> Method; ....
這讓我很困惑。 當我嘗試獲取這些模塊之一的模塊信息時,編譯器添加了一些內容: {abstract,true}
在返回到:
mochiweb_request:module_info().
. 事實上,他們的文檔將這些模塊稱為abstract modules
。
我在谷歌上搜索並找到了一篇關於參數化模塊的論文:鏈接太大了,但我相信如果你繼續在這里,你會得到這篇論文
這些模塊不能直接調用,而是通過它們自身的實例調用。 它使模塊表現得好像它們很有趣。 我開始意識到它是運行時系統中的一個非官方特性。 讓我感到困惑的是,mochiweb 人使用得很好! 在 mochiweb 模塊中,你會發現你自己在寫:
loop(Req,_DocRoot)-> "/" ++ Path = Req:get_path(), Body = Req:recv_body(), Method = Req:get(method), ..., ...., Response = Req:ok({"text.html;charset=utf-8",[],chunked}), Response:write_chunk("Some text here....."), ...
嘗試io:format("\\n\\t Req = ~p~n",[Req])
揭示了一個復雜的數據結構(元組),其element(1,Req) == mochiweb_request
。 挺有趣的!?!!!?
問題 1 是:目前在生產中使用穩定還是我可以等到正式發布?
問題 2 是:如果尚未正式發布,mochiweb 人是如何獲得使用它的信心的?
問題三:為什么還沒有正式發布? (因為,對我來說,它帶來了一些面向對象的特性)
問題4:有沒有人也用過它? 他/她在哪些情況下使用了這些參數化模塊? 為什么? 您能否指出我們在那里查看或發布指向某些源代碼的鏈接,以便我們可以了解有關此功能的更多信息?
最后一個問題:我在 Erlang 文檔中沒有發現這個特性被提及。 沒有課本,甚至沒有家。 那么,那些已經使用過它的人是如何知道如何以及為什么使用它的呢? 它是否已經包含在此處找到的 Erlang Run time 系統的商業版本中?
它在 R16B 中被刪除。 從自述文件:
OTP-10616 實驗功能“參數化模塊”(也稱為“抽象模塊”)已被刪除。 對於依賴參數化模塊的應用程序,有一個解析轉換可用於仍然使用參數化模塊。 可以在以下位置找到解析轉換: http : //github.com/erlang/pmod_transform
從 Mochiweb 2.4.0 版本開始,參數化模塊的使用已被刪除,盡管對以前參數化模塊的調用看起來仍然相同, 因為參數化模塊(元組模塊)的實現機制是為了向后兼容而保留的。 即使在Erlang/OTP 21.0 中從編譯器中刪除了對元組調用的支持:
OTP-14497 應用程序:編譯器,erts
* 潛在的不兼容 *
已從運行時系統中刪除對“元組調用”的支持。 元組調用是一個未記錄且不受支持的功能,它允許應用操作的模塊參數是一個元組:
Var = dict:new(), Var:size()
。 這個“功能”經常引起混亂,特別是當這樣的調用失敗時。 堆棧跟蹤會指出源代碼中不存在的函數。對於由於某些其他原因需要使用參數化模塊或元組調用的遺留代碼,有一個名為
tuple_calls
的新編譯器選項。 當給出這個選項時,編譯器將生成額外的代碼來模擬模塊是變量的調用的舊行為。
Mochiweb現在對這種類型的代碼使用tuple_calls
編譯器選項來保持工作。
根據技術委員會於2012 年 10 月 16 日宣布結束參數化模塊的決定:
董事會承認,盡管它一直處於試驗階段,但許多軟件都依賴於此功能。 當前的實現形式是不可接受的,並且參數化模塊本身從未被接受為語言中的一個特性。 該功能也與 module-fun 等不兼容,並且未與 OTP 中的其他工具完全集成。
它對於生產使用非常穩定,並且已經有一段時間了。 它不是官方標准的一部分。
您將不得不為此詢問 mochiweb 人員。 也許他們相信如果它被拉動,他們可以迅速改變它。
因為它充滿了爭議。 不清楚它給語言帶來了什么好處以及它如何使事情更容易做,所以 P. 模塊有它的支持者和反對者。 因此,當前的觀點是它是實現的一部分,所以人們可以玩它,看看他們是否覺得它使他們的代碼更容易閱讀和編寫。 非官方意味着它可以在不棄用的情況下被刪除,而且似乎 Erlang 人保留了這種權利。
個人偏見:我有點喜歡它,但我永遠不會使用它來將 OOP 功能引入 Erlang。 OOP 是一個丑陋的垃圾龐然大物,在編程中永遠沒有立足之地。 痛苦只會困擾你的程序,直到它們腐爛到核心,像僵屍一樣走來走去,發瘋。 那時唯一的解決方案是霰彈槍。 相反,我想將它用作 ML 風格的函子——它更靜態,因為我覺得它更符合 Erlang 的習慣用法。
幾年前,作者在 Erlang 會議上介紹了這個東西。 從那以后,它一直是口耳相傳等的組合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.