纯Scheme网络编程工具
这一切都是通过Goeteia生成的。下面的Scheme在您的浏览器中被编译为WebAssembly并实时挂载。正在启动编译器……3D标题是一个WebGL粒子云——它的字形、飞行和颜色全部在此源代码中。编辑点阵行,调整着色器,按运行。此页面携带完整的编译器(goeteia.wasm,约70 KB gzipped,首次加载后缓存);每次重新编译约需15毫秒。 内容介绍: 自我托管,逐字节 编译器是用它所编译的Scheme子集编写的。自我托管的构建重新编译自己,输出是字节相同的——固定点在每次更改时以CI方式检查,并且每个测试都在两个阶段中运行。 原生Wasm GC对象 Fixnums被解包为i31ref,成对和记录为GC结构,eq?是一个ref.eq。没有JavaScript中的阴影堆:主机提供两个字节流导入,别无其他。 卫生宏 syntax-rules和带有防护的过程syntax-case,嵌套椭圆和datum->syntax,在一个通过重命名实现卫生的编译时解释器中运行。 真实闭包,真实尾调用 带有快速每种元数的条目和每个闭包的通用条目的类型化函数引用——变参过程和apply很便宜,每个尾调用都是返回调用。100M次迭代的循环在大约150毫秒内以恒定堆栈运行。 数字塔 Fixnums在溢出时提升为bignums(内联检查,两次位比较),flonums具有传染性, rationals和complex是精确的,浮点文字通过纯Scheme被编码为IEEE-754——因此两个主机发出相同的字节。 call/cc和dynamic-wind 逃逸继续沿着Wasm异常处理提案运行:捕获是O(1),正常路径的成本为一个try块,风器在退出时按从内到外的顺序展开。 反应式Web栈(web sx) 模板为细粒度(web reactive)信号、(web html)渲染器和一个(web js)FFI,直接进入主机——此页面就是用它构建的。 库 R6RS风格的(library ...)文件使用(import(math utils))解析,依赖关系第一;导出是建议性的,因为未使用的代码无论如何都会被修剪。 快速开始 $ git clone https://github.com/guenchi/Goeteia $ cd Goeteia $ ./run-tests.sh # 每个测试,两个编译器阶段 $ ./build-self.sh # 用自身重建编译器 $ echo '(define (fact n) (if (zero? n) 1 (* n (fact (- n 1))))) (fact 20)' > fact.ss $ node rt/compile.mjs goeteia.wasm fact.ss fact.wasm $ node rt/run.mjs fact.wasm 2432902008176640000 编译的模块可以在任何支持Wasm GC和尾调用的引擎上运行:Node 22+,当前的Chrome / Firefox / Safari,wasmtime。从源代码引导需要Chez Scheme;已检查的编译器wasm在没有它的情况下也能工作。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡