基础类型
Alia 语言的类型系统分为两大类:Code 和 Value。
1. Code 类型
Code 表示代码,是 Alia 中最核心的类型之一,用于定义语法结构。
子类型
- Key:关键字,单一词法单元
- Keys:多重关键字,由多个词法单元组成
- 符号
<>在多重关键字中代表参数 - 多重关键字可以查找直到上级定义分隔符
- 如:
<Keys keys> to <Stack stack>中,区别 keys 与 stack 匹配位置的是分隔符"to"
- 符号
- Variable:变量引用,可解析出任意变量、成员访问或索引访问的表达式
- 在运行时会解析为对应的变量值、对象成员值或数组元素值
- 支持以下形式:
- 简单变量:
x - 成员访问:
obj.property - 索引访问:
arr[0]、obj['key']
- 简单变量:
- 常用于需要动态获取变量或属性的场景
示例
alias whenTrue <Boolean condition> <Stack stack> -> { if condition { call stack.run } }
2. Value 类型
Value 表示内容,是 Alia 中用于存储数据的类型。
Value 操作限制(静态类型)
未收窄的 <Value> 参与以下操作会触发类型错误(TYPE_VALUE_OPERATION),需先通过 typeOf / Ok / as 收窄:
- 算术、逻辑、一元(
!、-)运算 if/while/for条件与each目标- 索引
value[...]与属性访问value.prop - 与另一个非字面量值的比较
合法动态桥接(例外):
- 与 字面量比较:
value == 42、value == '文本' call value.valueOf:显式解包底层值,返回原类型<Dynamic>完全绕过检查并传播为Dynamic
alias process <Value data> -> Value {
if typeOf data == 'Number' {
data * 2
} else {
data
}
}
子类型
- String:字符串
- Number:数字
- BigInt:任意精度整数
- 仅可与 BigInt 进行算术与比较运算,与 Number/String 混用会立刻报错,须先以
as BigInt显式转换 /与%为截断语义(同 C++):7n / 2n为3n,-7n % 3n为-1ntypeOf 123n返回'BigInt'
- 仅可与 BigInt 进行算术与比较运算,与 Number/String 混用会立刻报错,须先以
- Boolean:布尔值
- Object:对象
示例
~ 字符串
const str = 'Hello'
~ 数字
const num = 42
~ 任意精度整数(字面量为整数后加 n)
const big = 9999999999999999999999999999999999999999n
const product = big * big
print product
~ 布尔值
const bool = true
~ 对象
const obj = *[ name: 'Alia', version: 0.1 ]
3. Object 类型
Object 是 Alia 中的复合类型,包括以下子类型:
子类型
| 类型 | 描述 |
|---|---|
| Object String | 字符串对象 |
| Object Number | 数字对象 |
| Object BigInt | 任意精度整数对象 |
| Object Boolean | 布尔对象 |
| Object Array | 数组 |
| Object Object | 对象 |
| Object Stack | 栈 |
| Object Alias | 关键字别名 |
| Object Error | 错误 |
| Object Sheet | 二维数组表 |
| Object Date | 日期与时间 |
| Object RegExp | 正则表达式 |
| Object Channel | 信道 |
| Object Color | 颜色 |
| Object ColoredString | 染色字符串 |
对象语法
| 语法 | 描述 |
|---|---|
*[ <Key key>: <Value value>, ... ] | 定义对象 |
[ <Value value>, ... ] | 定义数组 |
*{ ... } | 定义一个新语境栈 |
{ ... } | 定义一个使用原语境的栈 |
mut *{ ... } | 定义一个新语境的可变栈 |
mut { ... } | 定义一个使用原语境的可变栈 |
多参数内置方法使用辅助关键字分隔参数,如 to、with、at、or、limit、and、in、from、named、keyed、returning。
示例
~ 数组
const arr = [1, 2, 3, 4, 5]
~ 对象
const obj = *[ name: 'Alia', version: 0.1 ]
~ 栈(新建语境)
const stack = *{
let x = 1
print x
}
~ 栈(使用原语境)
const stack2 = { print x }
~ 可变栈(新建语境)
const mutStack = mut *{
if Has 'count' { count = count + 1 } else { let count = 1 }
count
}
~ 可变栈(使用原语境)
const mutStack2 = mut {
let val = 10
val
}
~ 访问对象属性
print obj.name
print arr[0]
print call stack.run
print call mutStack.run ~ 输出 1
print call mutStack.run ~ 输出 2
分隔符
Alia 中的语句以换行终结:
\n:换行符
语句以换行符分隔,标准范式使用换行作为语句终结。
分词符号
:空格
空格用于分隔关键字和参数,是词法分析时的基础分隔符。
转义字符
'\':转义其后单个字符'${}':转义 中所有字符
基础字符(字面量)
| 类别 | 符号 | 描述 |
|---|---|---|
| 四则运算 | + - * / % | 基本数学运算 |
| 逻辑运算 | & | ! | 逻辑与、或、非 |
| 条件分支 | ? : | 三元运算符 |
| 空安全合并 | ?? | 空安全合并 |
| 大小比较 | > < >= <= != == | 比较运算符 |
| 运算顺序 | ( ) | 括号 |
| 字符串 | ' " | 字符串定界符 |
| 关键字 | ` | 关键字定界符 |
| 字符串连接 | .. | 字符串加法 |
| 数字 | 0-9 | 数字字符 |
| BigInt 后缀 | n | 整数后加 n 表示任意精度整数,如 123n |
类型检查系统
Alia 的类型检查在 Check 阶段执行,位于 Astify 之后、Interpret/Compile 之前。
示例代码
~ 类型示例
const str: String = 'Hello'
const num: Number = 42
const bool: Boolean = true
const arr: Array = [1, 2, 3]
const obj: Object = *[ name: 'Alia' ]
~ 类型检查
if typeOf str == 'String' { print 'str is a String' }
if typeOf num == 'Number' { print 'num is a Number' }
if Ok str { print str.length }
assert (Ok str)
const numFromStr = '42' as Number