理解这个' Alloy中的关键字

时间:2015-01-01 02:10:51

标签: alloy

在Alloy book第4.7.2节的以下代码中, this 关键字引用了什么?

module library/list [t]
sig List {}
sig NonEmptyList extends List {next: List, element: t} 

...

fun List.first : t {this.element} 
fun List.rest : List {this.next} 
fun List.addFront (e: t): List {
    {p: List | p.next = this and p.element = e} 
}

如果您在Alloy中详细说明用法,我将不胜感激。

1 个答案:

答案 0 :(得分:6)

软件抽象的第4.5.2节(以及其他内容)描述了它所谓的接收器'约定,这是将函数和谓词编写为

的语法简写
fun X.f[y : Y, ...] { ... this ... }

而不是

fun f[x : X, y : Y, ...] { ... x ... }

即宣言

fun List.first : t {this.element} 

相当于(和简写/句法糖)

fun first[x : List] : t {x.element} 

同样的,你提供的其他例子。如果我们说长形式是

,那么并行会更强
fun first[this : List] : t {this.element} 

虽然这是一个有用的插图,但它不合法:this是一个关键字,不能用作普通的变量名。


你要求详细描述"合金中this的用法这是一项调查。关键字this可用于以下情况:

  • 在声明和签名事实中,this充当隐式绑定到签名的每个实例的变量。所以表格的声明

    sig Foo { ... } { copacetic[this] }
    

    相当于

    sig Foo { ... }
    fact { all f : Foo | copacetic[f] }
    
  • 在声明和签名事实中,对签名声明或继承的字段f的每个引用都隐式扩展为this.f,其中this隐式绑定,如上所述,除非引用前缀为@。 4.2.4末尾的例子说明了语义。

  • 在使用' receiver'声明的函数和谓词的声明体中。约定,关键字this充当隐式绑定到函数或谓词的第一个参数的变量。 4.5.2结尾处的例子说明了这一点,OP在这里引用的例子也是如此。

    接收者'约定在语言参考的B.7.5节中定义。

所有这些都是从 Software Abstractions 索引中的this条目中指出的;有关更多信息,请阅读相关段落。