# ezl **Repository Path**: plus7wist/ezl ## Basic Information - **Project Name**: ezl - **Description**: A easy lisp language. - **Primary Language**: Rust - **License**: WTFPL - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-05 - **Last Updated**: 2024-04-09 ## Categories & Tags **Categories**: scripting-language **Tags**: None ## README # ezl - 随和的 Lisp ezl(easy lisp)是一种 Lisp(list processor)。它还没有完成 1.0 版本,现在有的特性是: - 基本类型:数值、布尔值、字符串、`Vec` 和函数。 - 变量绑定:将值绑定到符号。 ``` ;; 变量 name 绑定为字符串 "Alice" (let name "Alice") ;; a 设为 10,b 设为 11 (let a 10 b 11) ``` 在同一个作用域不允许重复绑定。 ``` (let a 10) (let a 11) # NameError ``` - 赋值:赋值会改变变量的值。尝试赋值未绑定的值会产生错误。 ``` (let a 10) ; bind (set a 11) ; assign (assert-eq a 11) ``` - 定义函数:函数是输入一些值输出一个(或者零个)值的计算过程,同时在语义上保持其他变量的稳定。输入变量称作函数的参数,输出变量称作函数的返回值。其他变量不会随着函数代表的计算发生的位置不同而发生变化,称函数具有闭包性。 ``` ;; 函数 add 接受 a 和 b 两个参数,返回 a 和 b 的和 (func (add a b) (+ a b)) ``` - 循环: `(for (name . sequence) . body)` 对于每个可以迭代的 `sequence` 包含的值,绑定到 `name` 执行一次 `body`。 目前可以迭代的值有:迭代器、`Vec`。 - 迭代器:迭代器是可以被迭代的对象。 迭代器是一个函数,它返回第一个类型为 `'StopIteration` 的值之前的所有返回值都是它产生的值。 `StopIteration` 是一种特别的错误类型,它可以由 `(stop-iteration)` 函数产生。 - 短路逻辑运算。 ``` (or a b c d) # 在求值第一个真值的位置返回真 (and p q r s) # 在求值第一个假值的位置返回假 ``` - 一些内建函数。 - 错误处理系统。 常见的程序错误,例如函数参数个数不对,计算发生在不支持的类型上,都会产生错误(Error)。在 ezl 中的错误除非主动处理,否则会随着函数调用栈逐层向上传播,直到 ezl 的解释器,ezl 的解释器接收到 Error 之后会停止程序运行。 `(try ...)` 表达式是阻止错误向上传播的方法,try 包裹的代码产生的错误,不会继续向上传播,而是变成 try 的值,可以被程序继续处理。而如果没有错误产生,try 语句的值就是它包裹的最后一个 S 表达式的求值的结果。 `(is-error x)` 用来判断 `x` 是否是错误。 `(type x)` 用来获取 `x` 的类型,返回值是一个符号,对于错误类型可能是 `'NameError` 或者 `'TypeError` 等。 可以查看 ezl-test 目录下的文件探索 ezl 现在的能力。