heol

Lobsters Hottest 工具

摘要

Heol是一种为Uxn虚拟机设计的16位Lisp编程语言,具有基本的Lisp构造,目前正在开发中。

<p><a href="https://lobste.rs/s/pr1po9/heol">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/09/13 08:47

# heol 来源: https://wiki.xxiivv.com/site/heol.html ## Heol 是针对 Uxn 虚拟机的 Lisp 系统。 Heol 是一款 16 位 Lisp (https://wiki.xxiivv.com/site/lisp.html),旨在完美适配带有 Varvara (https://wiki.xxiivv.com/site/varvara.html) 绑定的 Uxn (https://wiki.xxiivv.com/site/uxn.html)。该系统目前仍在开发中。 ### 操作环境 其执行过程由表达式规约构成:原子返回自身值,列表则被视为函数应用——其中第一个元素是函数名,其余部分为参数。参数在传入函数前会被求值。 ### 列表操作 `(cons 值 列表)` 过程用于构造序对,`(car 列表)` 过程提取列表的第一个元素,`(cdr 列表)` 过程则提取剩余部分。 ``` (cons 'a '(b c)) ; (a b c) (car '(a b c)) ; a (cdr '(a b c)) ; (b c) ``` ### 逻辑判断 `(eq? a b)` 过程在比较的两个表达式值均为原子时返回标志值 \#t 或 \(\)——前提是两者同为相同数字或相同符号: ``` (eq? 'a 'a) ; #t (eq? 'a 'b) ; () ``` 对于三个表达式,`(if 标志 当真值 当假值)` 过程在标志值为 \#t 时返回第二个值,否则返回第三个值。 ``` (if #t 123 456) ``` ### 算术运算 算术运算符采用前缀表示法 (https://wiki.xxiivv.com/site/notation.html): ``` (* (+ 3 5) 19) ; 152 ``` ### 过程定义 `(lambda 参数列表 表达式)` 表达式求值后生成过程。在 lambda 表达式求值时生效的环境被封装于新创建的过程内,此即闭包。给定一个表达式,`(quote 表达式)` 过程会将其原样作为值返回。 ``` ((lambda (x) (* x x)) 3) ; 9 ``` `(define 名称 表达式)` 表达式将表达式绑定至名称,使得在代码中均可引用该绑定。 ``` (define double (lambda (x) (+ x x))) (double 5) ; 10 ``` ### 序列操作 Heol 没有显式的序列规约方式(如 `progn`、`begin` 等),而是使用 `(and x1 x2 ... xk)`——该表达式返回最后一个非空值。需注意的是,`and` 在遇到第一个返回假值的参数后将不再求值后续参数。这仍然可作为高效手段,例如打印某个值后返回另一个值。 ``` (and (print 'hello) 42) ; 打印 "Hello",但返回 42 ``` ### 循环结构 现在我们已具备构建循环并打印每一步状态所需的组件。 ``` (define count-down (lambda (n) (if (< n 0) n (and (print n) (count-down (- n 1)))))) (count-down 9) ``` ``` 9876543210 ``` ### 程序示例 若将所有概念整合: ``` (define fac (lambda (n) (if (< n 2) 1 (* n (fac (- n 1)))))) (print (fac 5)) ; 120 ``` ### 总结 - `(eval x)` 返回 x 的求值结果(例如当 x 被引用时) - `(quote x)` 特殊形式,返回未求值的 x 原样 - `(cons x y)` 构造序对 `(x . y)` - `(car p)` 序对 p 的 car 部分 - `(cdr p)` 序对 p 的 cdr 部分 - `(if x y z)` 若 x 非空则返回 y,否则返回 z - `(let* ((v1 x1) (v2 x2) ...) y)` 将每个变量 vi 绑定至 xi 后求值 y - `(lambda v x)` 构造闭包 - `(define v x)` 定义全局命名值 - `(+ n1 n2 ... nk)` n1 至 nk 的和 - `(- n1 n2 ... nk)` n1 至 nk 的差 - `(* n1 n2 ... nk)` n1 至 nk 的积 - `(/ n1 n2 ... nk)` n1 至 nk 的商 - `(% n1 n2 ... nk)` n1 至 nk 的余数 - `(< n1 n2)` 若 n1<n2 则返回 \#t,否则返回 \(\) - `(eq? x y)` 若 x 等于 y 则返回 \#t,否则返回 \(\) - `(pair? x)` 若 x 为非空列表、cons 单元或闭包则返回 \#t - `(or x1 x2 ... xk)` 第一个非空的 x,否则返回 \(\) - `(and x1 x2 ... xk)` 若所有 x 非空则返回最后一个 x,否则返回 \(\) - `(not x)` 若 x 为空则返回 \#t,否则返回 \(\) - `(dotimes (i x) fn)` 将 fn 执行 x 次 - `(print x)` 打印 x 的值,返回 x - `(deo 端口 x)` 将 x 发送至 Varvara 端口 (https://wiki.xxiivv.com/site/varvara.html) - 查看源码 (https://wiki.xxiivv.com/etc/heol.tal.txt),Uxntal 格式 - 代码仓库 (https://git.sr.ht/~rabbits/heol),Uxntal 格式 **相关条目:**函数式编程 (https://wiki.xxiivv.com/site/functional.html)、oscean (https://wiki.xxiivv.com/site/oscean.html)、2026 (https://wiki.xxiivv.com/site/2026.html)、2025 (https://wiki.xxiivv.com/site/2025.html)

相似文章

将 Python 转译为 Lisp

Lobsters Hottest

LispE 是 NAVER 推出的一款开源 Lisp 方言,兼具函数式与数组编程特性,并支持 PyTorch、llama.cpp 以及 MLX 等 AI 库。该语言既可作为原生应用运行,也可打包为支持多线程与现代函数式编程特性的 WebAssembly 库。

JavaScript 精简

Lobsters Hottest

LispE 是 NAVER 开发的一个紧凑的 Lisp 方言,它结合了函数式和数组语言特性,并支持 PyTorch 和 llama.cpp 等 AI 库。