Pregunta

Agregar un elemento al encabezado de una lista alista (lista asociativa) es bastante simple:

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

Sin embargo, agregarse a la cola de un alista es un poco más complicado.Después de experimentar un poco, produje esto:

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

Sin embargo, me parece que ésta no es la solución idiomática.Entonces, ¿cómo se suele hacer esto en el esquema?¿O es realmente así?

¿Fue útil?

Solución

No te agregas a una lista A.Estás en una lista A.

Una lista A es lógicamente un conjunto de asociaciones.No te importa el orden de los elementos de un conjunto.Lo único que te importa es la presencia o ausencia de un elemento en particular.En el caso de una lista A, lo único que le importa es si existe una asociación para una etiqueta determinada (es decir, un par cuyo CAR es el valor especificado) y, dada esa asociación, el valor asociado (es decir, en este implementación, el CDR del par).

Otros consejos

Common Lisp define una función llamada ACONES exactamente para este propósito, donde

(acons key value alist)

es equivalente a:

(cons (cons key value) alist)

Esto sugiere fuertemente que simplemente hablar con un alista es idiomático.Tenga en cuenta que esto significa dos cosas:

  1. Como las búsquedas generalmente se realizan de adelante hacia atrás, las asociaciones agregadas recientemente tienen prioridad sobre las más antiguas.Esto se puede utilizar para una implementación ingenua de entornos tanto léxicos como dinámicos.
  2. Si bien incluir en una lista es O(1), agregar generalmente es O(n), donde n es la longitud de la lista, por lo que el uso idiomático es mejor para el rendimiento y es estilísticamente preferible.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top