5

将元素添加到 alist(关联列表)的头部非常简单:

> (cons '(ding . 53) '((foo . 42) (bar . 27)))
((ding . 53) (foo . 42) (bar . 27))

不过,附加到 alist 的尾部有点棘手。经过一些实验,我制作了这个:

> (define (alist-append alist pair) `(,@alist ,pair))
> (alist-append '((foo . 42) (bar . 27)) '(ding . 53))
'((foo . 42) (bar . 27) (ding . 53))

但是,在我看来,这不是惯用的解决方案。那么这通常是如何在方案中完成的呢?或者这实际上是这样的?

4

2 回答 2

8

Common Lisp 专门为此目的定义了一个名为ACNS的函数,其中

(acons key value alist)

相当于:

(cons (cons key value) alist)

这有力地表明,简单地向 alist 妥协是惯用的。请注意,这意味着两件事:

  1. 由于搜索通常从前向后执行,因此最近添加的关联优先于旧关联。这可以用于词汇和动态环境的简单实现。
  2. 虽然进入列表是 O(1),但附加通常是 O(n),其中 n 是列表的长度,因此惯用用法最有利于性能,并且在风格上更可取。
于 2008-09-18T20:45:37.513 回答
5

您不会附加到一个列表。你在一个名单上。

a-list 在逻辑上是一组关联。您不关心集合中元素的顺序。您所关心的只是特定元素的存在与否。在 a-list 的情况下,您关心的只是给定标签是否存在关联(即,其 CAR 是指定值的对),以及给定该关联,关联值(即,在此实施,对的 CDR)。

于 2008-09-18T20:21:08.710 回答