2008-09-18 8 views
4

Добавление элемента в голову ассоциативного списка (список ассоциативного) достаточно прост:Как добавить к схеме alist в схеме?

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

прилагая к хвосту ассоциативного списка немного сложнее, хотя. После некоторого экспериментирования, я произвел это:

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

Тем не менее, мне кажется, что это не идиоматическое решение. Итак, как это обычно делается в схеме? Или это на самом деле способ?

+0

Я в восторге от людей, которые могут понимать языки, такие как схема – Danimal 2008-09-18 19:55:08

+0

Я тоже;) Серьезно, хотя это не так уж чуждо, как кажется; У этого есть забавный синтаксис. Через некоторое время вы перестанете замечать смешность. Я просто хобби-взломать схему, но я уже привык к этому. – troelskn 2008-09-19 18:08:20

ответ

3

Вы не добавляете к списку. Вы задерживаетесь в списке.

A-list логически представляет собой набор ассоциаций. Вы не заботитесь о порядке элементов в наборе. Все, о чем вы заботитесь, это наличие или отсутствие определенного элемента. В случае со списком все, что вам нужно, - это наличие ассоциации для данного тега (т. Е. Пара, CAR - это указанное значение) и, учитывая эту ассоциацию, связанное значение (т. Е. В этом реализация, CDR пары).

7

Common Lisp определяет функцию с именем ACONS именно для этой цели, где

(acons key value alist) 

эквивалентно:

(cons (cons key value) alist) 

Это наводит на мысль, что просто consing на ассоциативный список идиоматичен. Обратите внимание, что это означает две вещи:

  1. Поскольку обыски обычно выполняются спереди назад, недавно добавленные ассоциации имеют приоритет над более старыми. Это можно использовать для наивной реализации как лексических, так и динамических сред.
  2. При включении в список O (1) добавление, как правило, O (n), где n - длина списка, поэтому идиоматическое использование лучше всего подходит для производительности, а также является стилистически предпочтительным.