SwiftyLISP
Swift 的可嵌入 LISP 解释器
摘要
这个框架包含了一个根据 John McCarthy 的微型手册 和 这篇文章 描述的 LISP 解释器。
使用方法
该框架将嵌套结构中的字符串字面量转换为基于 SExpr
枚举,然后可以对其进行评估。
让我们看看一些使用示例:
import SwiftyLisp
var expr:SExpr = "(cond ((atom (quote A)) (quote B)) ((quote true) (quote C)))"
print(expr)
dump(expr)
print(expr.eval()!) //B
expr = "(car ( cdr ( quote (1 2 \"aaaa\" 4 5 true 6 7 () ))))"
print(expr.eval()!) //2
expr = "( (lambda (x y) (atom x)) a b)"
print(expr.eval()!) //true
expr = "(defun ff (x) (cond ((atom x) x) (true (ff (car x)))))"
print(expr.eval()!)
expr = "(ff (quote ((a b) c)))"
print(expr.eval()!) //a
expr = "(eval (quote (atom (quote A)))"
print(expr.eval()!) //true
expr = "(defun alt (x) (cond ((or (null x) (null (cdr x))) x) (true (cons (car x) (alt (cddr x))))))"
print(expr.eval()!)
expr = "(alt (quote (A B C D E))"
print(expr.eval()!) //(A C E)
以下是可用操作符的概述
原子 | 结构 | 描述 |
---|---|---|
打印 | (print e) | 打印其子表达式 |
评估 | (eval e) | 评估会评估其子表达式 |
引号 | (quote e) | 此原子在评估后返回其子表达式,不变,例如 (quote A) = A |
取车 | (car l) | 返回非空子列表的第一个元素,例如 (car (quote (A B C))) = A |
取 cdr | (cdr l) | 返回在第一个元素之后的子列表中的所有元素,组成一个新的列表,例如 (cdr (quote (A B C))) = (B C) |
构造 | (cons e l) | 返回一个新列表,以 e 为第一个元素,然后是子列表的内容,例如 (cons (quote A) (quote (B C))) = (A B C) |
相等 | (equal e1 e2) | 当两个符号表达式递归相等时返回一个合适命名的原子true,如果不相等则返回空列表()(同时作为nil和false值),例如(equal (car (quote (A B))) = (quote A)) |
原子 | (atom e) | 如果符号表达式是一个原子或者是一个列表,返回true;如果是一个列表,返回空列表,例如(atom A) = true |
cond | (cond (p1 e1) (p2 e2) ... (pn en)) | 返回第一个不等于空列表的p表达式,这基本上是一个条件原子,语法比普通的if结构稍微复杂一些。例如(cond ((atom (quote A)) (quote B)) ((quote true) (quote C) = B) |
List | (list e1 e2 ... en) | 返回所有给定表达式的列表,等价于递归地对表达式序列应用cons。(list (quote (A B)) (quote C)) = (A B C) |
Lambda | ( (lambda (v1 ... vn) e) p1 ... pn) | 定义一个包含体e的lambda表达式,该表达式描述了一个匿名函数,它使用一系列环境变量v。此函数将使用提供的参数作为变量的值来评估。例如,((lambda (X Y) (cons (car x) y) (quote (A B)) (cdr (quote (C D)))) = (A D) |
Defun | (defun (v1 ... vn) e) | 定义一个lambda表达式并将其注册到当前上下文中以便后续使用。我们可以定义一个像(defun cadr (X) (car (cdr x)))这样的函数,并在另一个表达式像(cadr (quote (A B C D)))中使用它。 |
额外的示例以及文中定义的附加函数和首字母缩略词可以在框架的测试套件中找到。
安装
可以使用CocoaPods、Carthage或SwiftPM安装该库。
要使用Swift包管理器将其包含到项目中,请向您的Package.swift
文件中添加一个依赖项。
import PackageDescription
let package = Package(
...
dependencies: [
...
.Package(url: "https://github.com/uraimo/SwiftyLISP.git")
]
)
无论您如何将框架添加到项目中,都可以使用import SwiftyLisp
导入它。
许可协议
The MIT License (MIT)
版权所有(c)2016 Umberto Raimondi
以下条件下,本软件和相伴文档文件("软件")的副本的使用者获得免费使用、复制,修改,合并的权利,发布,分发,转授权和/或出售副本,并允许任何接收软件的人使用软件,受以下条件约束。
上述版权声明和本许可声明应包含所有副本或软件的主要部分。
本软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、针对特定目的的适用性和非侵权性。在任何情况下,作者或版权持有人不对任何索赔、损害或其他责任负责,无论是基于合同行为、侵权还是其他行为,这些索赔、损害或其他责任源于、源于或与软件或对软件的使用或其他方式有关。