理解 Alloy 中的“this”关键字

understanding the 'this' keyword in Alloy

在合金书第 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} 
}

如果您能详细说明合金中的用法,我将不胜感激。

Software Abstractions 的第 4.5.2 节描述了(除其他外)它所谓的 'receiver' 约定,即写作的句法 shorthand函数和谓词为

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

而不是

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

即声明

fun List.first : t {this.element} 

等同于(和shorthand/语法糖)

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

你给出的其他例子也是如此。如果我们说长形式是

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

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


您要求 "elaborate description" this 在 Alloy 中的用法。这是一项调查。关键字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 此处引用的示例也是如此。

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

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