Erlang中的参数化模块

Muz*_*hua 6 erlang module parameterized

我正在浏览mochiweb源代码并且看到了以前从未使用过的东西.该模块声明尤其是在mochiweb_requestmochiweb_response模块在了Mochiweb HTTP库中找到.以下是模块的开始:

-module(mochiweb_request,[Socket, Method, RawPath, Version, Headers]).
-author(...).

然后在模块中你看到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家伙尚未正式使用它,他们是如何获得使用它的信心的?

问题3:为什么它还没有正式发布?(因为,对我来说,它带来了一些面向对象的功能)

问题4:那里有没有人使用过它?他/她在哪些情况下使用这些参数化模块?为什么?你能指点我们看看或发布一些源代码的链接,以便我们可以找到更多有关此功能的信息吗?

最后一个问题:没有在Erlang Docs中我发现了这个功能.没有教科书,甚至没有回家.那么使用它的人是如何找到使用它的方式和原因的呢?它是否已经包含在此处的Erlang Run时间系统的商业版本中?

I G*_*ERS 3

问题1是:目前在生产中使用是否稳定,或者我可以等到它正式发布吗?

它对于生产使用非常稳定,并且已经存在了一段时间了。它不是官方标准的一部分。

问题 2 是:如果尚未正式发布,mochiweb 人员如何获得使用它的信心?

你必须向 mochiweb 的人询问这个问题。也许他们相信,如果它被拉动,他们可以很快改变它。

问题3:为什么还没有正式发布?(因为,对我来说,它带来了一些面向对象的功能)

因为它充满争议。目前还不清楚它给语言带来了什么好处以及它如何使事情变得更容易,因此 P.Modules 有它的支持者和反对者。因此,目前的观点是它是实现的一部分,因此人们可以使用它,看看他们是否觉得它使他们的代码更易于阅读和编写。非官方性意味着它可以在不被弃用的情况下被拉动,而且似乎 Erlang 人保留了这一权利。

个人偏见:我有点喜欢它,但我永远不会使用它来将 OOP 功能引入 Erlang。OOP 是一个丑陋的垃圾庞然大物,在编程中永远没有地位。只是痛苦会困扰你的程序,直到它们彻底腐烂,像僵尸一样走来走去,发疯。此时唯一的解决办法就是霰弹枪。相反,我想将它用作 ML 风格的函子——它更加静态,因为我觉得它更符合 Erlang 的习惯用法。

最后一个问题:我在 Erlang 文档中没有找到任何谈到此功能的地方。没有课本,甚至没有家。那么那些已经使用过它的人是如何知道如何以及为什么使用它的呢?它是否已包含在此处找到的 Erlang 运行时系统的商业版本中?

作者在几年前的 Erlang 会议上介绍了这个东西。此后一直是口碑相传等相结合的方式。

  • 仅供参考 Erlang 在 R16B 中删除了此功能。查看第 4 期:http://www.erlang.org/news/35。 (2认同)