遵循OCL中的链接列表

时间:2013-11-26 10:19:39

标签: ocl bold-delphi

我使用Bold实现了OCL的Delphi。 OCL擅长过滤列表等。但我还没有找到一种通用的遍历链表的通用方法。

假设我有一个班级PlanMission。它包含指向自身的单个链接PlanMission.previous。它还有一个布尔属性isDummy

我希望遍历PlanMissions的列表,直到我有isDummy的实例。

我能做到

if isdummy then
  self
else if previous->notEmpty and previous.isdummy then
  previous
else if previous.previous->notEmpty and previous.previous.isdummy then
  previous.previous
else
  nil
endif
endif
endif

我真正想要的是这样的:

traverseList(previous, isDummy)

traverseList不存在,但它应该有2个参数。

  • previous:要关注的链接
  • isDummy:一个布尔条件,所以我知道何时停止

如何实现这一目标?

修改说明 我不想要任何Delphi代码。我想要OCL中的代码。使用Bold的人知道我的意思。 OCL是一种具有查询对象,属性等的查询语言。它没有副作用,因此它是只读的。可以找到OCL简介here.

1 个答案:

答案 0 :(得分:1)

您需要计算previous关系的有序传递闭包。 (self,self.previous,self.previous.previous等)

在OCL 2.3.1中,它是self->asOrderedSet()->closure(previous)

然后您可以通过以下方式提取第一个虚拟PlanMission(如果没有,则为null)

let c:Set(PlanMission) = 
  self->asOrderedSet()->closure(previous)->select(x|x.isDummy) in
  if c->isEmpty() then null else select(x|x.isDummy)->first()

OCL 2.3.1的第11.9节预定义迭代器表达式的映射规则中,closure的{​​{1}}定义如果您的工具可以使用iterate支持旧版本的OCL。