Pregunta:
Me sorprende que los anillos (de make-ring
) sean secuencias (satisfacen la sequencep
), pero no pueden ser operados por funciones de secuencia estándar ( length
, elt
, etc.).
Entonces, ¿qué implica ser una "secuencia"? El manual de Elisp dice que:
El tipo "secuencia" es la unión de otros dos tipos Lisp: listas y matrices. En otras palabras, cualquier lista es una secuencia y cualquier matriz es una secuencia. La propiedad común que tienen todas las secuencias es que cada una es una colección ordenada de elementos.
El diagrama del manual no incluye anillos. ¿Los anillos realmente deberían considerarse secuencias?
Respuesta:
La sequencep
predicadosp devuelve un valor no nulo si su argumento es una lista o una matriz, y en este caso, "lista" incluye una celda de contras (un par de puntos). (sequencep '(a . b))
devuelve t
.
(setq foo (make-ring 3))
Ch v foo
muestra que foo
es (0 0 . [nil nil nil])
.
Entonces, un anillo es una secuencia, porque es una desventaja, pero una secuencia no es necesariamente un anillo.
Si sequencep
debería comportarse de esta manera en Emacs Lisp es una buena pregunta. No corresponde a lo que Common Lisp considera una secuencia, por ejemplo. En Common Lisp, solo las listas adecuadas (con nil
como último cdr) son secuencias, no listas con puntos.
Tiene la función ring-convert-sequence-to-ring
, que devuelve un anillo que corresponde a su argumento de secuencia.