Perl 6 本身是否支持契约式设计?

Does Perl 6 natively support Design by Contract?

在 Eiffel 和 Spec# 旁边的 Wikipedia 上,它被列为具有原生 DbC 支持的语言,但我在文档或测试套件中找不到任何提及。

2019 年更新

Imo,没有。

因为我不认为 6.d "implements most DbC features natively" 对 "most" 的合理定义我 removed it from the Wikipedia Design by Contract page.

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

我认为:

  • P6 的原材料应该可以重复使用到 "implement most of DbC"。

  • 一个自然的开始是用户空间模块。 (然后自然适合维基百科页面,但在 Languages with third-party support 部分。)

下面是我的想法的草图。

1. ORing 前提条件和 ANDing postconditions/invariants 在例程 composition/inheritance/delegation:

的上下文中
  • 实现一种动态调用(或者可能只是静态引用) PRE statements/blocks 和 POST [=125] 的方法=],共 "relevant ancestor" 个例程。

  • 正在确定"relevant ancestors"。对于不涉及多重调度的 class 层次结构(或对象委托链),"relevant ancestors" 大概很容易根据 callsame 确定机制。但是在一般情况下,基于非常不同的多重调度范例,可能有许多 "competing" 候选者,感觉非常不同。它们都是 "relevant ancestors",因此将它们的所有 PREPOST 条件组合起来是否合适?我目前认为不是。

  • 修改例程selection/dispatch。请参阅 OO::Actors 以了解如何最有效地执行此操作的模板。目标是,根据 DbC 规则,获胜例程的 PRE statements/blocks 及其 "relevant ancestors" 逻辑或运算在一起,POST statements/blocks 逻辑运算和运算。

  • 支持classPREPOST块。已经可以在 class 中编写 PREPOST 块,但它们与 class 的构造相关联,而不是对 class 中方法的后续调用.对于后者,以下 S04 speculation 似乎是门票:

It is conjectured that PRE and POST submethods in a class could be made to run as if they were phasers in any public method of the class. This feature is awaiting further exploration by means of a ClassHOW extension.

原回答

查看 Block Phasers,尤其是 PREPOST 移相器。我没用过它们,距离我读埃菲尔铁塔书已经有 25 年了,但它们对我来说很重要。

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

如果您能查看文档、试验它们(可能使用 an online P6 evaluator)并报告回来,那么我们可以了解您对它们的看法,如果您遇到了 TODO,那就太棒了' d 错误或任何其他错误,并决定要做什么:

  • 维基百科页面说它列出了 "Languages that implement most DbC features natively"。大概 "most" 限定符是主观的。 P6 是否在本机实现所有(或 "most")DbC 功能?如果不是,它可能需要从维基百科页面中删除。

  • 除非我们确定 P6 does DbC claim 是伪造的,否则我们大概需要将 'DbC' 和 'Design by Contract' 添加到 doc 和 doc 索引中。 (大概你搜索了其中一个或两个,但没有找到匹配项,这就是导致你认为找不到它们的原因,对吧?)

  • 我们还需要 PREPOST 的示例,无论它们是否被正式视为 DbC 功能。但我们已经知道,从某种意义上说,P6 已经超越了 wazoo,尽管有许多人做出了贡献,但其中大部分内容仍未记录为官方 p6doc 的一部分。有很多事情要做!如果您可以使用 PREPOST 想出几个非常好的简单示例,也许是根据您在烘焙测试中看到的内容开发的,那将是非常壮观的。 :)