词法与字面量
支持行注释、可嵌套块注释、数字分隔符、原始字符串和多行字符串。
// 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""";
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); }
`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,用 `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();
`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;
}