Perl 6是否原生支持设计合同?

6
它被列为一种具有原生DbC支持的语言,与Eiffel和Spec#一起在维基百科上列出,但我在文档或测试套件中找不到任何提及。

嗨@contemplator。你认为我的答案可以接受吗?如果不行,请考虑写下评论,说明它缺少什么和/或你认为可以接受的答案类型。谢谢。 - raiph
@raiph,你的回答非常好,我都忘了这是我的问题 :) - catemperor
1个回答

6

2019 更新

我认为不行。

因为我不认为 6.d“本地实现了大多数 DbC 特性”,对于“大多数”的合理定义,我已经从维基百科的设计契约页面中将其删除

(如果您认为尽管有上面和下面的 SO 和我的注释,它应该被放回到本地部分,请确保它按字母顺序出现。)

我认为:

  • P6 有原材料,可重复使用以“实现大多数 DbC”。

  • 一个自然的开始是一个用户空间模块。(然后自然适合维基百科页面,但在具有第三方支持的语言部分中。)

以下是我所思考的草图。

1. 在例程组合/继承/委托的上下文中,对前置条件进行 OR 运算和对后置条件/不变量进行 AND 运算:

  • 实现一种动态调用(或者只是静态引用)仅“相关祖先”例程的 PRE 语句/块以及单独的 POST 语句/块的方法。

  • 确定“相关祖先”。对于不涉及多重分派的类层次结构(或对象委托链),通过 callsame 机制很容易确定“相关祖先”。但在一般情况下,由于多重分派的非常不同的范例,可能会有许多“竞争”的候选者,这感觉非常不同。它们都是“相关祖先”,因此将它们所有的 PREPOST 条件组合起来是否合适?我目前认为不是。

  • 修改例程选择/分派。参见例如 OO::Actors,了解如何以最高效的方式进行修改的模板。目标是根据 DbC 规则,将获胜例程及其“相关祖先”的 PRE 语句/块逻辑 OR 在一起,并且 POST 语句/块逻辑 AND。

  • 支持 级别的 PREPOST 块。可以在类中编写 PREPOST 块,但它们与类的构造相关联,而不是随后对类内方法的调用。对于后者,以下 S04 speculation 似乎是正确的方法:

据推测,类中的PRE和POST子方法可以在类的任何公共方法中运行,就像它们是phaser一样。通过ClassHOW扩展,这个特性正在等待进一步探索。

原始回答

查看Block Phasers,特别是PREPOST phasers。我没有使用过它们,而且距离我读Eiffel书已经有25年了,但它们看起来很合适。

PREPOST phasers在S04-phasers/pre-post.t中进行了测试。我至少看到一个bug TODO。

如果您能查看文档,尝试使用在线P6评估器进行实验,并回报给我们您的想法,我们将不胜感激。请告诉我们是否遇到了TODO的错误或其他任何问题,以便我们决定如何处理:

  • 维基百科页面中说它列出了“实现大多数DbC功能的语言”。可以想象,“大多数”这个限定词是主观的。P6是否本地实现了所有(或“大多数”)DbC功能?如果没有,那么它可能需要从维基百科页面中删除。

  • 除非我们决定P6 DbC声明是虚假的,否则我们可能需要将'DbC'和'Design by Contract'添加到文档和文档索引中。(可能您搜索了其中之一或两者,没有找到匹配项,这就是导致您认为找不到它们的原因,对吧?)

  • 无论官方是否认为PREPOST是DbC功能,我们也需要为它们提供示例。但是,我们已经知道P6拥有强大的功能,但其中许多功能仍未记录在官方p6doc的一部分,尽管许多人都在贡献。还有很多工作要做!如果您能够提供几个真正好的、简单的使用PREPOST的示例,可能是从您在烤测试中看到的内容开发而来,那将是非常棒的。:)


1
DbC不是更多关于让类为其公共方法指定前置条件和后置条件,以使得子类在覆盖这些方法时无意中违反条件吗?(例如,在Perl 5中查看Attribute::Contract。)Phasers不会做任何这样的事情。 - smls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接