手册目录

函数

函数用于组织行为,也可以通过可调用 spec 作为值传递。

声明与调用

func add(a: int, b: int): int {
  return a + b;
}

let sum = add(20, 22);

所有参数都必须声明类型。无返回值函数可以省略 : void;未声明返回类型的普通函数也可以从一致的 return 路径推导返回类型。公共 API 建议显式声明返回类型。

函数可按名称和参数列表重载,返回类型不参与重载区分:

func describe(value: int): string {
  return "integer";
}

func describe(value: string): string {
  return value;
}

程序入口

可执行项目必须且只能有一个顶层入口:

func main(args: string[]) {
  // args[0] 是程序路径
}

入口返回类型固定为 void。库项目中的 main 只是普通函数,不会成为入口。

变长参数

变长参数写作 T...,并且必须位于参数列表最后:

import std.text;

func join_words(separator: string, words: string...): string {
  return string.join(separator, words);
}

let text = join_words(", ", "Feng", "is", "clear");

函数体内将变长参数按 T[] 使用。

Lambda

Lambda 必须由可调用形式的 spec 提供目标类型:

spec Mapper(value: int): int;

let double: Mapper = (value: int) -> value * 2;
let transform: Mapper = (value: int) {
  let next = value + 1;
  return next * 2;
};

单表达式 Lambda 使用 ->;多行 Lambda 直接使用块体。Lambda 可以捕获外层绑定,捕获的 var 与外层共享同一存储。

func make_adder(base: int): Mapper {
  return (value: int) -> base + value;
}

方法值

对象方法可以绑定为可调用值:

spec Action(): void;

type Button {
  func click() {
    println("clicked");
  }
}

let button = Button {};
let action: Action = button.click;
action();

方法值会保留原对象作为 self。若方法有重载,显式目标 spec 必须能够唯一确定所选重载。