跳到主要内容

基础类型

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 为 -1n
    • typeOf 123n 返回 'BigInt'
  • 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

下一步​