Examples embedded

示例直接融入页面,用于阅读和解释器测试对照。

这些片段来自 `examples/syntax` 的当前语法分组,但页面内直接展示,不要求用户下载文件。

// 01 lexical_literals
var decimal = 42;
var hex_value = 0xFF;
var binary_value = 0b1010;
var separated = 1_000_000;
var scientific = 6.02e23;
var raw_string = `C:\path\*`;
var multiline_string = """line one
line two""";
var empty_value = null;
var yes = true;
// 02 declarations_types
var bool flag = true;
var int count = 10;
var float ratio = 0.5;
var string name = "lns";
const int MAX_COUNT = 100;

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

var Point origin = Point{ x = 0, y = 0 };
var inferred_point = Point{ x = 1, y = 2 };
// 03 expressions_operators
var a = 10;
var b = 3;
var arithmetic = a + b * 2 - 4 / 2 + 7 % 3;
var bitwise = (a & b) | (a ^ b);
var compare = a > b && b <= 3 || a == 10;
var ternary = compare ? a : b;
var fallback = null ?? 99;

a++;
++b;
var type_name = typeof a;
var is_number = a is int;
// 04 control_flow
for (var i = 0; i < 5; i++) {
  if (i == 2) {
    continue;
  }
}

var stop = false;
for (var row = 0; row < 3; row++) {
  if (stop) {
    break;
  }
  for (var col = 0; col < 3; col++) {
    if (row + col > 3) {
      stop = true;
      break;
    }
  }
}
// 05 functions_lambdas_returns
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;
var next_value = x => x + 1;
// 06 tables_structs_methods
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();
// 07 modules_api_extern
import gpio;
import { clamp, avg } from "utils";
import * as mathx from "mathx";

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

export function int exported_inc(int v) {
  return v + 1;
}
// examples/bindings/mylib.lnb
// Generator automatically pairs this file with mylib.h.

option module = "mylib";
option output_contract = "trusted/lib/mylib.lns";
option output_glue = "mylib_glue.c";
option output_init = "mylib_init.c";
option init_name = "lnlib_init_mylib";

api "mylib" {
  starts  : int  = mylib_starts();
  add     : num  = mylib_add(num a, num b);
  name    : str  = mylib_name() @nonnull;
  set_led : int! = mylib_set_led(int pin, int on);
}

api "device" {
  open  : handle = device_open(str id) @handle("Device") @borrowed;
  close : int!   = device_close(handle device) @handle("Device");
}
// 99 comprehensive_syntax_test
import gpio;
import { clamp } from "utils";

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

struct Counter {
  var string name;
  var int value = 0;
}

function int Counter.next(self) {
  self.value++;
  return self.value;
}

fn int main() {
  var Counter c = Counter{ name = "main", value = 0 };
  var arr = { 1, 2, 3, [5] = 5 };
  var computed = (x) => x * 2;
  var value = computed(c.next());

  for (var i = 0; i < 3; i++) {
    arr[i] = arr[i] ?? 0;
    value += arr[i];
  }

  try {
    gpio.write(1, value);
  } catch (e) {
    value = -1;
  } finally {
    value += 1;
  }

  return value is int ? value : 0;
}