【问题标题】:Parameterised Modules in ErlangErlang 中的参数化模块
【发布时间】:2011-07-17 09:02:49
【问题描述】:

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

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

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

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

这些模块不能直接调用,而是通过它们自身的实例调用。它使模块表现得好像它们很有趣。我开始意识到它是运行时系统中的一个非官方特性。让我感到困惑的是,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 的人是如何获得使用它的信心的,如果它尚未正式发布?

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

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

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

【问题讨论】:

标签: module erlang parameterized


【解决方案1】:

问题一是:现在在生产中使用稳定还是可以等到正式发布?

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

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

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

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

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

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

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

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

【讨论】:

  • 仅供参考 Erlang 在 R16B 中删除了此功能。在erlang.org/news/35查看第 4 期。
【解决方案2】:

问题一是:现在在生产中使用稳定还是可以等到正式发布?

它在 R16B 中被删除。来自the README

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

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

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

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

* 潜在的不兼容性 *

对“元组调用”的支持已从 运行时系统。元组调用是一个无证和 允许模块参数的不受支持的功能 使应用操作成为元组:Var = dict:new(), Var:size()。这个“功能”经常引起混乱, 特别是当这样的调用失败时。堆栈跟踪将 指出源中不存在的函数 代码。

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

Mochiweb now uses the tuple_calls compiler option 让此类代码继续工作。

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

来自 2012 年 10 月 16 日的Technical Board decision announcing the end of parameterised modules

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

【讨论】:

  • 技术委员会决定的链接似乎不再有效,我找不到真正的...
  • 我也没有,好像消失了。我更改了链接以使用 Wayback Machine。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多