Как мне добавить в список в схеме? - PullRequest
5 голосов
/ 18 сентября 2008

Добавление элемента в заголовок 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))

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

Ответы [ 2 ]

8 голосов
/ 19 сентября 2008

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

(acons key value alist)

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

(cons (cons key value) alist)

Это настоятельно говорит о том, что простое обращение к алисту идиоматично. Обратите внимание, что это означает две вещи:

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

Вы не добавляете в список. Вы попали в список.

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

...