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",因此将它们的所有 PRE
和 POST
条件组合起来是否合适?我目前认为不是。
修改例程selection/dispatch。请参阅 OO::Actors
以了解如何最有效地执行此操作的模板。目标是,根据 DbC 规则,获胜例程的 PRE
statements/blocks 及其 "relevant ancestors" 逻辑或运算在一起,POST
statements/blocks 逻辑运算和运算。
支持class级PRE
和POST
块。已经可以在 class 中编写 PRE
和 POST
块,但它们与 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,尤其是 PRE
和 POST
移相器。我没用过它们,距离我读埃菲尔铁塔书已经有 25 年了,但它们对我来说很重要。
PRE
和 POST
移相器在 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 索引中。 (大概你搜索了其中一个或两个,但没有找到匹配项,这就是导致你认为找不到它们的原因,对吧?)
我们还需要 PRE
和 POST
的示例,无论它们是否被正式视为 DbC 功能。但我们已经知道,从某种意义上说,P6 已经超越了 wazoo,尽管有许多人做出了贡献,但其中大部分内容仍未记录为官方 p6doc 的一部分。有很多事情要做!如果您可以使用 PRE
和 POST
想出几个非常好的简单示例,也许是根据您在烘焙测试中看到的内容开发的,那将是非常壮观的。 :)
在 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",因此将它们的所有PRE
和POST
条件组合起来是否合适?我目前认为不是。修改例程selection/dispatch。请参阅
OO::Actors
以了解如何最有效地执行此操作的模板。目标是,根据 DbC 规则,获胜例程的PRE
statements/blocks 及其 "relevant ancestors" 逻辑或运算在一起,POST
statements/blocks 逻辑运算和运算。支持class级
PRE
和POST
块。已经可以在 class 中编写PRE
和POST
块,但它们与 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,尤其是 PRE
和 POST
移相器。我没用过它们,距离我读埃菲尔铁塔书已经有 25 年了,但它们对我来说很重要。
PRE
和 POST
移相器在 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 索引中。 (大概你搜索了其中一个或两个,但没有找到匹配项,这就是导致你认为找不到它们的原因,对吧?)
我们还需要
PRE
和POST
的示例,无论它们是否被正式视为 DbC 功能。但我们已经知道,从某种意义上说,P6 已经超越了 wazoo,尽管有许多人做出了贡献,但其中大部分内容仍未记录为官方 p6doc 的一部分。有很多事情要做!如果您可以使用PRE
和POST
想出几个非常好的简单示例,也许是根据您在烘焙测试中看到的内容开发的,那将是非常壮观的。 :)