Core syntax

核心语法:小而明确,适合解释器实现。

LNS 禁止裸类型声明,所有声明都从关键字开始。struct 类型名可以用于表达式里的实例化,但不能作为声明起始。

词法与字面量

支持行注释、可嵌套块注释、数字分隔符、原始字符串和多行字符串。

// line comment
/* outer /* inner */ outer */

var n = 1_000_000;
var hex = 0xFF;
var bin = 0b1010;
var raw = `C:\path\*`;
var multi = """line one
line two""";

声明与类型

统一 `var`,常量用 `const`。类型标注写在变量名前。禁止 `int x;` 和 `Point p;`。

var int count = 10;
var string name = "lns";
const double PI = 3.14159;

struct Point {
  var int x;
  var int y;
}

var Point p = Point{ x = 1, y = 2 };
var inferred = Point{ x = 3, y = 4 };

表达式与运算符

保留 C 风格运算符,加入 `??`、`is`、lambda。无双点区间语法。

var value = a + b * 2;
var ok = value > 0 && value != 10;
var fallback = maybe_null ?? 42;
var result = ok ? value : fallback;
var next = x => x + 1;

value += 1;
value <<= 1;
var kind = typeof value;
var is_int = value is int;

语句与控制流

支持 if、switch、三种 for、while、do-while、break、continue。不支持标签跳转。

for (var i = 0; i < 10; i++) {
  if (i % 2 == 0) {
    continue;
  }
  if (i > 7) {
    break;
  }
}

for (var k, v in map) { print(k, v); }
for (var item of arr) { print(item); }

函数、多返回与 lambda

`fn` 是 `function` 的缩写。支持默认参数、变参、多返回、函数表达式和表达式体 lambda。

fn int inc(int v) {
  return v + 1;
}

function (int, int) divmod(int a, int b) {
  return a / b, a % b;
}

function collect(first, ...rest) {
  return first, rest;
}

var double_value = (x) => x * 2;

table 与 struct

table 是核心聚合结构。struct 是带名义标签的受约束 table,用 `Type{ ... }` 实例化。

var arr = { 1, 2, 3 };
var map = { name = "lns", ver = 1.0 };
var mix = { 1, x = 2, [3] = "three" };

struct Animal {
  var string name;
  var int age = 0;
}

function string Animal.speak(self) {
  return self.name + " speaks";
}

var dog = Animal{ name = "Rex", age = 3 };
var sound = dog.speak();

模块、api 与 extern

`extern` 只能出现在 `api` 块内。宿主用 api 契约开放能力,用户脚本 import 后调用。

import gpio;
import { clamp } from "utils";
import * as mathx from "mathx";

api "gpio" {
  extern void write(int pin, num value);
  extern num read(int pin);
}

export function int exported_inc(int v) {
  return v + 1;
}