4

物事のペアにコンスを使用するのは良いスタイルですか、それともリストに固執する方が望ましいでしょうか?

たとえば、質問と回答のように:

(list
    (cons
        "Favorite color?"
        "red")
    (cons
        "Favorite number?"
        "123")
    (cons
        "Favorite fruit?"
        "avocado"))

つまり、ペアで自然に発生するものもあります。2つ以上を保持できるものは必要ないので、consが自然な選択になると思います. ただし、1 つのこと (リスト) に固執するべきだとも感じています。

より良い、またはより受け入れられるスタイルは何ですか?

4

3 に答える 3

9

あなたが持っているのは連想リスト(alist)です。実際、連想リストのエントリは、リストではなく単純なコンスであることが多いため (ただし、これは好みの問題です。連想リストのエントリにリストを使用する人もいます)、何を持っていても問題ありません。ただし、通常はリテラル構文を使用することを好みます。

'(("Favorite color?" . "red")
  ("Favorite number?" . "123")
  ("Favorite fruit?" . "avocado"))

assqシンボルはインターンされているため、alist は通常、シンボルをキーとして使用し、代わりに を使用してシンボル alist を検索できますassoc。これは次のようになります。

'((color . "red")
  (number . "123")
  (fruit . "avocado"))
于 2012-12-07T04:24:02.090 に答える
2

状況に応じて自分で決める必要があります。普遍的な答えはありません。異なるタスクは、構造に対して異なる働きをします。次の点を考慮してください。

  • キーのハッシュテーブルを検索する方が高速です。その後、alist にあります。
  • alist を使用する場合は、イテレータを使用してその状態を保存する方が簡単です (hash-table では、すべてのキーを配列またはリストとしてエクスポートし、そのリストへのポインターを保持する必要があります。イテレータの状態を復元して反復を続行できるようにするための alist へのポインタ。
  • Alist vs list: 他のすべての文字がアトムであることを考えると、偶数個の要素に対して同じ量の cons を使用します。リストとalistsを使用する場合、要素の数が奇数でないことを確認する必要があります(そして、それを発見するのが遅すぎるかもしれません)。これは悪いことです。
  • しかし、組み込みのものを含め、適切なリストで機能し、連想リストでは機能しない関数がもっとたくさんあります。たとえば、 ではないnthにヒットすると、alist でエラーが発生します。cdrlist
  • 場合によっては、特定のマクロが連想リストで期待どおりに機能しないことがあります。たとえば、次のようになります。

(destructuring-bind (a b c d) 
  '((100 . 200) (300 . 400)) 
   (format t "~&~{~s~^,~}" (list a b c d)))

期待どおりには機能しません。

  • 一方、特定の手順は、適切なリストに対して行わないことを「だまされて」実行される場合があります。cdrたとえば、copy-list を使用して連想リストをコピーする場合、 aである conses のみがlist新たにコピーされます (状況によっては、これが望ましい結果になる場合があります)。
于 2012-12-07T09:54:00.763 に答える