2008-09-18 71 views
4

添加到一个ALIST(关联表)的头的元件是很简单的:如何追加到计划中的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)) 

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

+0

我对能理解Language – Danimal 2008-09-18 19:55:08

+0

等语言的人表示敬畏,所以我;)认真地说,这不是外国人看起来那样;它只是一个有趣的语法。过了一段时间,你不再注意到这种滑稽。我只是爱好 - 用计划攻击,但我几乎已经习惯了它。 – troelskn 2008-09-19 18:08:20

回答

3

你不附加到一个列表。你对一个名单感兴趣。

a-list在逻辑上是一组关联。你不关心集合中元素的顺序。所有你关心的是某个特定元素的存在与否。在a列表的情况下,你所关心的是,是否存在给定标签(即,CAR是指定值的配对)的关联,并且在给定该关联的情况下,关联的值(即,在此实施,该对的CDR)。

7

Common Lisp中定义了一个名为ACONS出于这样的目的函数,其中

(acons key value alist) 

等同于:

(cons (cons key value) alist) 

这有力地表明,简单地consing到一个ALIST是地道。请注意,这意味着两件事情:

  1. 作为搜索通常由前至后进行的,最近添加的关联优先于旧的。这可以用于词汇和动态环境的天真实施。
  2. 虽然列入O(1),但追加通常是O(n),其中n是列表的长度,所以习惯使用对于性能以及风格上更好。