LISP键值绑定存储和查找

时间:2012-10-21 18:30:57

标签: lisp key-value

我正在学习LISP,只想问一下在LISP程序中存储键值对的最佳选择。

对于我提到的键值对,我想像JAVA中的Map Collection一样使用它:我想用键存储键,并且可以按键查找值。
例如:如果我的字符串"apple""fruit"匹配,我希望能够存储该对(如果它不存在),并且可以查询与{{{1}相关联的值1}},这是水果。

任何推荐或代码示例都会非常有用。提前谢谢你

3 个答案:

答案 0 :(得分:2)

你没有指定你正在学习哪个Lisp(Scheme,Common Lisp等)所以我要猜测Common Lisp。如果我不正确请发表评论,我会相应地进行编辑。

在Lisp中,这样的事情被称为关联列表。它是非常常用的,因此有一些便利功能可以实现。尽管如此,它只不过是一对((key . value) ... )的列表。

我建议您查看Carnegie Melon's explanation,它会简要概述assocalist-cons等功能,以便轻松处理关联列表。我发现它非常有用。

关联列表的问题是,虽然它们具有恒定时间插入,但删除和查找都是 O(n)。因此,如果速度是一个大问题,您将需要转向实际的哈希表。

Common Lisp Cook book对这些有很好的解释。它们依赖于允许恒定时间随机访问的实际数组(有时称为向量)。与关联列表不同,它们提供 O(1)查找。然而,它们并不像关联列表那样容易使用,因为Lisp一般都擅长列表。

注意:对于Scheme,如果您的编译器默认不提供,那么大多数这些函数应该与SRFI 1和69扩展一起提供。

答案 1 :(得分:1)

在Common Lisp中,您可以使用关联列表。

参见Common Lisp Hyperspec关于association lists和函数ASSOC

对于任何更复杂和更快的内容,Common Lisp提供hash tables

答案 2 :(得分:0)

为了使比较公平,Java中的Map是一个接口。它有各种各样的实现,它们是如此不同,它们可能无法在读/写/删除操作中为您提供相同的复杂性。有些可能被实现为链表,其他可能是二进制尝试等。

Java 中的

Map 定义了访问数据的方式,但没有定义数据的存储方式。

Lisps,好吧,如果你考虑CLOS,没有接口的概念,这是因为CLOS支持多重继承。没有足够的类似于Java的Map,因为没有以这种方式访问​​集合的概念,也没有接口的概念,因为它们存在于Java中。

Java中有Map的几种标准实现。一个是HashMapHashtable与它非常相似)。这与Common Lisp中的hash-table类非常相似。 Java中也有LinkedHashMap,它与Lisp中的关联列表非常相似。一个简单的Lisp不提供红黑树映射,并且没有关于线程的标准化行为 - 您需要阅读有关特定实现的文档,但是您可以在这里找到许多各种数据结构的良好实现: http://www.cliki.net/Data%20structure