结构体

定义

这个 struct 构造引入一个名义上类型化的或命名的产品。

struct Point {
  x: int;
  y: int;
}

instance Str[Point] {
  fun str (p:Point) =>
    "Point(" + p.x.str + ", " + p.y.str + ")"
  ;
}

var p = Point (2,3);
println$ p.str;

这里,我们注意到一个点由两个整数组成,x和y,我们可以通过将类型名Point应用于一对整数来确定点。

我们还提供了一个 Str 用方法分类 str 或类型 Point->string 把一个点转换成人类可读的形式。 Str 是一个普遍开放的标准库类。

方法

结构可以有两种方法: accessorsmutators . 以下是Point的扩展版本:

struct Point {
  x: int;
  y: int;
  fun norm => max (self.x, self.y);
  proc reset { self.x <- 0; self.y <- 0; }
  proc set (a:int, b:int) { self.x <- a; self.y <- b; }
}
var p = Point (1,2);
var y = p.norm;
p.set(p.x + 1, p.y + 1);

访问器,使用 fun binder,隐式获取一个额外的参数 self 类型的 Point . 变异子,带 proc binder,隐式获取一个额外的参数 self 类型的 &Point ,指向一个点的指针。

对象闭包

实际上,这些方法都是普通的函数和过程。嵌套只是语法上的甜点:

struct Point {
  x: int;
  y: int;
}

fun norm (self: Point) => max(self.x, self.y);
proc reset (self: &Point) { self.x <- 0; self.y <- 0; }
proc set (self: &Point) (a:int, b:int) { self.x <- a; self.y <- b; }

因此,这些方法是高阶函数,我们可以在Point类型的对象上形成闭包:

var p = Point (1,2);
var setp = &p.set; // object closure
var resetp = { &p.reset; }; // object closure
setp (23,42);
println$ p.str;
resetp;
println$ p.str;

注意 &p.reset 将调用reset,因此我们需要在通用闭包构造函数中包装调用 {{_}} .