← 都来码← 文档索引Scheme原文English

Scheme

Lisp 方言,括号就是一切。

在手机上怎么跑

vml run examples/scheme/test/sysinfo.scm

编译要等一会儿(C 那种要一两分钟,脚本类语言几秒)。程序跑起来后屏幕底部就是手柄,方向键 + 四个动作键都在;点右上角返回可以回到命令行。

写法要点

示例

文件演示什么
test/catch.scm接方块
test/sysinfo.scm设备信息

同目录还有:demo/demo_std.scm、math/main.scm、sicp/1.2.5-greatest_common_divisors_gcd.scm、test/libs.scm、tty/demo_tty.scm、ui/demo_ui.scm

实测踩过的坑


下面的内容是从 VML 源码里直接带的(third_party/vml/VMLPrepares/SchemeCompiler/): README 讲这个前端支持什么、怎么编;语言规范 讲语法本身。上游一改,这里重新生成就是最新的。

语言规范

Scheme 语言编译器规范说明

版本:v1.0 | 日期:2026-07-06 | 修订者:深圳市探索智能科技有限公司

规范标准

字段值
目标标准R5RS (1998) 子集
发布年份1998
完成度~93%
测试32 通过

关键字

define lambda let let* if cond else begin and or not set! display newline print peek poke asm chipasm eq? equal? null?

概述

支持 Scheme (R5RS) 语言子集,编译为 VML 汇编代码。采用 S-表达式解析架构,支持函数式编程核心特性。

支持的语言特性

1. 数据类型
2. 表达式
3. 函数
4. 绑定结构
5. 输入输出
6. 内存操作
7. 内联汇编

编译模式

MCU 模式(默认 --mode mcu)

针对单片机环境优化。

OS 模式(--mode os,预留)

全部语言特性可用。

使用示例

;; 阶乘
(define (fact n)
  (if (<= n 1)
      1
      (* n (fact (- n 1)))))

;; 匿名函数
(define f (lambda (x) (+ x 1)))
(print (f 5))

;; let 绑定
(let ((x 10) (y 20))
  (print (+ x y)))

;; let* 顺序绑定
(let* ((x 1) (y (+ x 1)))
  (print y))

;; cond 多分支
(define (sign x)
  (cond ((< x 0) (print -1))
        ((> x 0) (print 1))
        (else (print 0))))

;; 内存操作
(asm "nop")
(peek 0x4000)
(poke 16384 65)

浮点与64位编译模式

VML 工具链通过三个编译参数控制浮点和 64 位整数的处理策略:

参数可选值默认值说明
--float32hard / soft / nonehard32位浮点 (flonum) 处理模式
--float64hard / soft / nonesoft64位浮点处理模式
--int64hard / soft / nonesoft64位整数处理模式
32位浮点 (float32)

Scheme 中的 flonum(不精确浮点数)在 VML 编译时按以下模式处理:

64位浮点 (double)

Scheme 中的双精度浮点运算按以下模式编译:

64位整数 (int64)

Scheme 中的大整数(bignum)超出 32 位范围时按以下模式处理:

软件模拟库

以上软件模拟库均位于 Lib/shared/ 目录,使用 C 语言编写并由 C 编译器编译为 VML,所有语言共享:

库文件用途核心函数
softfloat.cQ15.16 定点数 32 位浮点模拟__vml_float_add/sub/mul/div/neg/abs/cmp、__vml_int2float/float2int
softdouble.cIEEE 754 双精度 64 位浮点模拟__vml_double_add/sub/mul/div/neg/abs/cmp、__vml_int2double/double2int、__vml_float2double/double2float
softint64.c64 位整数双寄存器模拟__vml_i64_add/sub/neg/and/or/xor/not/shl/shr

编译

# 编译 Scheme 到 VML
dotnet run --project VMLPrepares/SchemeCompiler input.scm -o output.vml

# 运行
dotnet run --project VMLEmulators/ConsoleEmulator -- -r output.vml

测试

# 运行 Scheme 测试
dotnet test VMLTests/VMLTests.csproj --filter "SchemeTests"

🆕 字符串编码 (v1.65.19)

该语言编译器通过共享库 (Lib/shared/) 间接使用 VML 字符串体系。

伪指令宽度编码C 类型
.string8-bitUTF-8char*
.wstring16-bitUTF-16LEwchar_t*
.ustring32-bitUTF-32LEchar32_t*

MCU 模式 (默认): 字符串输出为 UTF-8 (.string) OS 模式: 可通过 VML_WSTRING 宏判断编码

共享库已提供宽字符串转换函数 (wchar.h/uchar.h),各语言编译器可按需使用。

编译器 README

Scheme (R5RS 子集) 编译器

路径: VMLPrepares/SchemeCompiler/ 完成度: ~93% | 🟢 生产可用 标准库: Lib/scheme/(待创建)

功能

缺失功能

编译模式

MCU 模式(默认 --mode mcu)

MCU 模式针对单片机/裸机环境(Arduino/STM32/8051 等)优化,自动跳过不兼容操作系统的特性。

跳过(遇到这些语法不生成代码):

保留(由 BIOS 实现底层):

OS 模式(--mode os,预留)

OS 模式针对带操作系统环境(如 Linux 嵌入式、RTOS 等),届时支持全部语言特性(文件系统、多线程、异步、异常、反射等)。

使用

dotnet run --project VMLTool -- input.scm -o output.vml

测试

测试内嵌在编译器源代码验证中