紧线性类型

一种紧线性类型,单位类型为1,空隙类型为0,或紧线性类型的任何小和或乘积。这里的Small表示下面描述的表示适合64位机器字。

紧凑线性类型有两个主要用途:用于子字级别的值操作和支持多进制数组操作。

单位和

以下类型是 unitsum 类型:

typedef void = 0;
typedef unit = 1;
typedef bool = 2; // 1 + 1
4 // 1 + 1 + 1 + 1
5 // 1 + 1 + 1 + 1 + 1
...

这些是0,1,2,3,4,5的和。。单位和表示0、1、2、3、4、5个备选方案。unitsum类型的值有两种表示法:

case 3 of 5
`3:5

第一种语法是通用的,第二种是单位和特有的。请注意,没有void类型的值,因为没有其他选择。unit类型的值也可以写入:

()

代表了一种选择。也可以写入bool类型的值

false // `0:2
true // `1:2

请注意,有点不幸的是,值索引是零原点,因此 case 0 of 5 是5例中的第一例 case 4 of 5 是最后一个。它读起来很糟糕,但是选择零原点是为了与C数组索引约定对称。

从1到1的所有单位和都由64位无符号整数表示。 [This may be relaxed and/or extended in future versions of Felix]

产品

紧线性类型的乘积是紧线性类型。例如:

var x : 2 ^ 4 = true, false, false, true;
println$ x.1; // false

这是一个由4位组成的数组,但它有一个神奇的特性:它是紧线性的,所以它由一个机器字来表示。最多64位的数组由单机器字表示。下面是另一个例子:

var x : 2 * (3 * 4) = true, (`1:3, `2:4);
println$ x.1.1._strr; // case 1 of 3

同样,值是一个单独的机器字。紧凑线性类型与C位字段类似,但是C位字段必须由$n$位组成,因此代表$2^n$值。Felix紧线性类型没有这样的约束。

紧致线性类型用标准变量基数系统表示。最简单的解释是下面的例子:

var time = (`2:24, `30:60, `1:60); // 1 second past 2:30 am
var secs = time :>> int;
println$ "Seconds into day = " + secs.str;
assert secs == 60 * 60 * 2 + 60 * 30 + 1;

紧凑线性类型之所以被命名为这种类型,是因为如果存在$n$的可能值,它们将由一系列0到$n-1$的整数表示。这个范围是紧凑的,也就是说里面没有洞,而且是线性的,因为它是积分的。