Wie füge ich an ein Alist im Schema an?

Das Hinzufügen eines Elements zum Kopf eines Alist (Assoziative Liste) ist einfach genug:

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

Dem Schwanz eines Alists zuzufügen, ist allerdings ein wenig komplizierter. Nach einigen Experimenten habe ich folgendes produziert:

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

Es scheint mir jedoch, dass dies nicht die idiomatische Lösung ist. Wie wird das normalerweise in einem Schema gemacht? Oder ist das tatsächlich der Weg?

0
Ich auch;) Ernsthaft, es ist nicht so fremd wie es scheint; Es hat nur eine witzige Syntax. Nach einer Weile hörst du auf, die Witze zu bemerken. Ich bin nur Hobbyhacker mit Schema, aber ich habe mich schon fast daran gewöhnt.
hinzugefügt der Autor troelskn, Quelle
Ich bin beeindruckt von Menschen, die Sprachen wie Scheme verstehen können
hinzugefügt der Autor Danimal, Quelle

1 Antworten

Common Lisp definiert eine Funktion namens ACONS für genau diesen Zweck, wo

(acons key value alist)

ist äquivalent zu:

(cons (cons key value) alist)

Dies legt nahe, dass es einfach ist, auf einen Alist zu verzichten. Beachten Sie, dass dies zwei Dinge bedeutet:

  1. Da Suchvorgänge normalerweise von vorne nach hinten ausgeführt werden, haben kürzlich hinzugefügte Verknüpfungen Vorrang vor älteren. Dies kann für eine naive Implementierung von sowohl lexikalischen als auch dynamischen Umgebungen verwendet werden.
  2. Während man sich auf eine Liste konzentriert, ist O (1), anhängend ist im Allgemeinen O (n), wobei n die Länge der Liste ist, so dass die idiomatische Verwendung für die Leistung am besten ist und stilistisch bevorzugt ist.
0
hinzugefügt