2008-09-18 79 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是列表的長度,所以習慣使用對於性能以及風格上更好。