5

連想リスト (連想リスト) の先頭に要素を追加するのは簡単です。

> (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 は、まさにこの目的のためにACONSと呼ばれる関数を定義しています。

(acons key value alist)

次と同等です。

(cons (cons key value) alist)

これは、単純に連想リストをコンスすることが慣用的であることを強く示唆しています。これは次の 2 つのことを意味することに注意してください。

  1. 通常、検索は前から後ろに実行されるため、最近追加された関連付けが古い関連付けよりも優先されます。これは、字句環境と動的環境の両方の単純な実装に使用できます。
  2. リストへのconsはO(1)ですが、追加は一般的にO(n)です。nはリストの長さです。
于 2008-09-18T20:45:37.513 に答える
5

a-listには追加しません。あなたはリストに短所を置きます。

a-listは、論理的には一連の関連付けです。セット内の要素の順序は気にしません。気になるのは、特定の要素の有無だけです。a-listの場合、気になるのは、特定のタグ(つまり、CARが指定された値であるペア)の関連付けが存在するかどうか、およびその関連付けが与えられた場合、関連付けられた値(つまり、実装、ペアのCDR)。

于 2008-09-18T20:21:08.710 に答える