如果你真的用 lisp 编写它应该不会花很长时间。大约一个下午,我用 Lisp 写了一个简单的数据库引擎。这是它的外观示例:
(select movies (<= 1990 year 2000) (member director '(terry-gilliam tim-burton)))
这里,'select' 是一个宏。它扫描其后面的谓词以查找作为字段名称的符号,并将它们绑定到数据库中的字段。然后它编写一个函数,将这些字段绑定到传递给函数的记录值,并使用该函数过滤表。宏扩展为如下内容:
(flet ((filter (item)
(let ((year (movie-year item))
(director (movie-director item)))
(and (<= 1990 year 2000)
(member director '(terry-gilliam tim-burton))))))
(loop for item in movies
if (filter item) collect item))
以这种方式(实际上是在 Lisp 中,而不仅仅是使用类似 Lisp 的语法)这样做很酷的事情是您可以免费获得编译。在我的系统上,上面的代码不是由数据库引擎解释的,它实际上是程序的编译部分(在 C 中不能这样做,现在可以吗?)。因此它很快,即使数据库代码本身(“选择”和表定义的代码)只有几行长。该数据库完全驻留在内存中,但这没关系......您可以更改宏以适应外部数据库,甚至编写它确实使用索引。这对于我正在从事的项目来说已经足够好了,所以我没有添加索引或任何花哨的东西。
我最喜欢它的部分是,虽然它保留了 SQL 的所有简洁性,但代码与它周围的代码没有什么不同,因为它都是 Lisp。您可以在搜索词中引入变量,而不必担心引用它们。