在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中详细说明此用法,我将不胜感激。
答案 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
条目中指出的;有关更多信息,请阅读相关段落。