簡體   English   中英

Erlang 中的參數化模塊

[英]Parameterised Modules in Erlang

我正在瀏覽 mochiweb 源代碼,並看到了我以前從未使用過的東西。 模塊聲明,尤其是在 mochiweb http 庫中的mochiweb_requestmochiweb_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 系統的商業版本中?

問題 1 是:目前在生產中使用穩定還是我可以等到正式發布?

它在 R16B 中被刪除。 自述文件

OTP-10616 實驗功能“參數化模塊”(也稱為“抽象模塊”)已被刪除。 對於依賴參數化模塊的應用程序,有一個解析轉換可用於仍然使用參數化模塊。 可以在以下位置找到解析轉換: http : //github.com/erlang/pmod_transform

問題 2 是:如果尚未正式發布,mochiweb 人是如何獲得使用它的信心的?

從 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 中的其他工具完全集成。

問題 1 是:目前在生產中使用穩定還是我可以等到正式發布?

它對於生產使用非常穩定,並且已經有一段時間了。 它不是官方標准的一部分。

問題 2 是:如果尚未正式發布,mochiweb 人是如何獲得使用它的信心的?

您將不得不為此詢問 mochiweb 人員。 也許他們相信如果它被拉動,他們可以迅速改變它。

問題三:為什么還沒有正式發布? (因為,對我來說,它帶來了一些面向對象的特性)

因為它充滿了爭議。 不清楚它給語言帶來了什么好處以及它如何使事情更容易做,所以 P. 模塊有它的支持者和反對者。 因此,當前的觀點是它是實現的一部分,所以人們可以玩它,看看他們是否覺得它使他們的代碼更容易閱讀和編寫。 非官方意味着它可以在不棄用的情況下被刪除,而且似乎 Erlang 人保留了這種權利。

個人偏見:我有點喜歡它,但我永遠不會使用它來將 OOP 功能引入 Erlang。 OOP 是一個丑陋的垃圾龐然大物,在編程中永遠沒有立足之地。 痛苦只會困擾你的程序,直到它們腐爛到核心,像僵屍一樣走來走去,發瘋。 那時唯一的解決方案是霰彈槍。 相反,我想將它用作 ML 風格的函子——它更靜態,因為我覺得它更符合 Erlang 的習慣用法。

最后一個問題:我在 Erlang 文檔中沒有發現這個特性被提及。 沒有課本,甚至沒有家。 那么,那些已經使用過它的人是如何知道如何以及為什么使用它的呢? 它是否已經包含在此處找到的 Erlang Run time 系統的商業版本中?

幾年前,作者在 Erlang 會議上介紹了這個東西。 從那以后,它一直是口耳相傳等的組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM