跳转至

函数与纯度

演示 def/fun/act 的分层,以及 unsafe fun 的回滚语法。第一个示例强调纯度分级的调用边界:def 只能调用 deffun 可调用 def/funact 具备副作用权限。第二个示例展示 unsafe fun 必须带权限列表与尾随 rollback,并说明回滚用于撤销可追踪副作用。

相关语法: 函数与纯度函数定义副作用权限系统

说明: 第一个示例中 compute 作为 fun 只使用纯函数 add,保持逻辑纯度;main 使用 act[io.out] 输出。第二个示例中 rollback 直接访问函数体内变量,语义等同于在 return 后执行,且要求多 return 情况下只使用所有分支都可达的变量。

use "std" -> std;

def add(i32 a, i32 b) -> i32 = a + b;

fun compute(i32 x) -> i32 {
  return add(x, 1);
}

act[io.out] main() -> i32 {
  val value = compute(41);
  std.println(value);
  return 0;
}
use "std" -> std;

// unsafe fun 必须带权限列表与回滚块
unsafe fun[] next_id() -> i32 {
  @static
  var i32 counter = 0;
  counter = counter + 1;
  return counter;
} rollback {
  // 回滚:撤销本次递增
  counter = counter - 1;
}

fun compute() -> i32 {
  // OK: unsafe fun[] 可被 fun 调用
  val id = next_id();
  return id;
}

act[io.out] main() -> i32 {
  val id = compute();
  std.println(id);
  return 0;
}