6

我正在浏览 mochiweb 源代码,并看到了一些我以前从未使用过的东西。模块声明,尤其是mochiweb http 库中mochiweb_request的模块声明。mochiweb_response以下是模块的开始方式:

-module(mochiweb_request,[Socket, Method, RawPath, Version, Headers])。
-作者(...)。

然后在你看到的模块中get(socket) -> Socket;get(method)-> Method; ....
这让我很困惑。当我尝试获取其中一个此类模块的模块信息时,编译器添加了一些内容:{abstract,true}在返回:
mochiweb_request:module_info().. 事实上,他们的文档将这些模块称为abstract modules.

我搜索了谷歌并找到了一篇关于参数化模块的论文:链接很大,但如果你继续关注这里,我相信你会得到这篇论文

这些模块不能直接调用,而是通过它们自身的实例调用。它使模块表现得好像它们很有趣。我开始意识到它是运行时系统中的一个非官方特性。让我感到困惑的是,mochiweb 的人用得很好!在 mochiweb 模块中,您会发现自己在编写:

循环(请求,_DocRoot)->
    "/" ++ 路径 = Req:get_path(),
    正文 = 请求:recv_body(),
    方法 = 请求:获取(方法),
    ...,
    .....,
    响应 = Req:ok({"text.html;charset=utf-8",[],chunked}),
    Response:write_chunk("这里有一些文字....."),
    ...

试图 io:format("\n\t Req = ~p~n",[Req])揭示一个复杂的数据结构(元组),其element(1,Req) == mochiweb_request. 挺有趣的!?!!!?

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

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

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

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

最后一个问题:我在 Erlang Docs 的任何地方都没有发现这个特性。没有课本,连家也没有. 那么那些使用过它的人是如何知道如何以及为什么要使用它的呢?它是否已经包含在此处找到的 Erlang Run time 系统的商业版本中?

4

2 回答 2

4

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

它在 R16B 中被删除。从自述文件

OTP-10616 实验功能“参数化模块”(也称为“抽象模块”)已被删除。对于依赖于参数化模块的应用程序,有一个解析转换可用于仍然使用参数化模块。可以在以下位置找到解析转换:http: //github.com/erlang/pmod_transform

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

从 2.4.0 版开始,已从 Mochiweb中删除了参数化模块的使用,尽管对以前参数化模块的调用看起来仍然相同,因为参数化模块(元组模块)的实现机制是为了向后兼容而保留的。即使在Erlang/OTP 21.0中从编译器中删除了对元组调用的支持:

OTP-14497 应用程序:编译器、erts

* 潜在的不兼容性 *

对“元组调用”的支持已从运行时系统中删除。元组调用是一个未记录且不受支持的功能,它允许应用操作的模块参数是元组:Var = dict:new(), Var:size()。这个“特性”经常引起混乱,尤其是当这样的调用失败时。堆栈跟踪会指出源代码中不存在的函数。

对于因其他原因需要使用参数化模块或元组调用的遗留代码,有一个新的编译器选项称为tuple_calls. 给定此选项时,编译器将生成额外的代码,以模拟模块为变量的调用的旧行为。

Mochiweb现在使用tuple_calls此类代码的编译器选项来继续工作。

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

根据2012 年 10 月 16 日宣布参数化模块结束的技术委员会决定:

董事会承认许多软件都依赖此功能,尽管它一直是实验性的。当前的实现形式是不可接受的,并且参数化模块本身从未被接受为语言中的一个特性。该功能也与例如模块乐趣不兼容,并且未与 OTP 中的其余工具完全集成。

于 2013-06-06T13:05:31.637 回答
3

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

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

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

您将不得不为此向 mochiweb 人员询问。也许他们相信如果它被拉动,他们可以迅速改变它。

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

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

个人偏见:我有点喜欢它,但我永远不会使用它来将 OOP 功能引入 Erlang。OOP 是一个彻头彻尾的丑陋庞然大物,在编程中没有一席之地。只是痛苦会困扰你的程序,直到它们腐烂到核心,像僵尸一样四处走动并发疯。那时唯一的解决方案是霰弹枪。相反,我想将它用作 ML 风格的仿函数——它更静态,因为我觉得它更符合 Erlang 的习惯用法。

最后一个问题:我在 Erlang Docs 的任何地方都没有发现这个特性。没有课本,甚至没有家。那么那些使用过它的人是如何知道如何以及为什么要使用它的呢?它是否已经包含在此处找到的 Erlang Run time 系统的商业版本中?

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

于 2011-03-17T19:30:31.630 回答