跳到主要内容

引用系统

Alia 的引用系统提供 ref、load、store 三个关键字,用于创建和操作变量引用。

1. 引用关键字​

ref — 创建引用​

ref <Variable name>

ref 创建一个指向已有变量的引用对象,返回类型为 Ref。

load — 读取引用​

load <Value ref>

load 解引用并读取引用指向的变量的当前值。

store — 写入引用​

store <Value ref> <Value val>

store 通过引用修改其所指向的变量的值。

2. 基本用法​

创建引用并读取值​

let x = 42
let r = ref x
print load r ~ 输出 42

通过引用写入值​

let y = 10
let r2 = ref y
store r2 99
print y ~ 输出 99

多个引用指向同一变量​

let z = 5
let r1 = ref z
let r2 = ref z
store r1 10
store r2 20
print z ~ 输出 20

3. 进阶用法​

在循环中通过引用修改变量​

let counter = 0
let r = ref counter
for { let i = 0 } i < 10 { i ++ } {
store r counter + 1
}
print counter ~ 输出 10

在条件分支中通过引用修改变量​

let value = 100
let r = ref value
if true {
store r 200
}
print value ~ 输出 200

通过引用的链式操作​

let a = 1
let b = 2
let ra = ref a
let rb = ref b
let va = load ra
let vb = load rb
store ra ((va as Number) + (vb as Number))
print a ~ 输出 3

通过引用交换变量值​

let x = 'hello'
let y = 'world'
let rx = ref x
let ry = ref y
let temp = load rx
store rx load ry
store ry temp
print x ~ 输出 'world'
print y ~ 输出 'hello'

4. 类型信息​

  • typeOf 对引用值返回 'Ref'
  • 尝试 load 非 Ref 类型的值会抛出错误
  • 尝试 store 写入非 Ref 类型的值会抛出错误
let x = 42
let r = ref x
print typeOf r ~ 输出 'Ref'

5. 错误处理​

~ 引用未定义的变量会抛出错误
let r = ref nonexistent ~ Error

~ 对非引用值执行 load 会抛出错误
let x = 42
load x ~ Error

~ 对非引用值执行 store 会抛出错误
let y = 10
store y 100 ~ Error

6. 机制说明​

  • ref 创建一个指向已有变量的引用对象,返回类型为 Ref
  • load 解引用并读取引用指向的变量的当前值
  • store 通过引用修改其所指向的变量的值
  • 引用遵循变量作用域规则:不能引用当前作用域不可访问的变量
  • ref 与 Has 均以 Variable 为实参:ref 引用当前作用域中的简单变量,Has <Variable name> 检查可变栈内是否存在指定变量

7. 作用​

  1. 间接访问:通过引用间接操作变量,适用于需要传递变量"指针"的场景
  2. 数据交换:方便地在不同作用域或函数间交换变量值
  3. 可变状态管理:通过引用在封闭语境中修改外部状态

下一步​