heol
摘要
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)
相似文章
Show HN: E-- – 一种介于英语和Python之间的语言
E-- 是一种使用规范英语语法并确定性编译为Python的编程语言,旨在结合LLM的创造力与可重现的运行时行为。
将 Python 转译为 Lisp
LispE 是 NAVER 推出的一款开源 Lisp 方言,兼具函数式与数组编程特性,并支持 PyTorch、llama.cpp 以及 MLX 等 AI 库。该语言既可作为原生应用运行,也可打包为支持多线程与现代函数式编程特性的 WebAssembly 库。
Hax – 一个用 C 编写的极简、终端原生编码代理
Hax 是一个用 C 编写的极简、终端原生编码代理,设计轻量、内存高效,对本地 LLM 使用友好,并支持多种提供商。
JavaScript 精简
LispE 是 NAVER 开发的一个紧凑的 Lisp 方言,它结合了函数式和数组语言特性,并支持 PyTorch 和 llama.cpp 等 AI 库。
Opus 是一个基于 f 表达式(内核语言)语义的最小化、静态作用域的 Lisp 方言
Opus 是一个在 Haskell 中实现的、最小化、静态作用域的 Lisp 方言,它使用 Continuation-Passing Style 并编译为 WebAssembly,具有操作性原语以提供表达力