Estoy realmente confundido con la .
notación. Es '(a . b)
una lista?
(listp '(a . b))
vuelve t
pero cuando quiero saber su longitud (length '(a . b))
da un error Wrong type argument: listp, b
. Lo mismo es para otras funciones como nth,mapcar
etc. todos dan el mismo error
¿Hay alguna función que pueda distinguir entre '(a b)
y '(a . b)
?
Contexto: Encontré este problema cuando quería implementar la versión recursiva de mapcar
. Aquí está mi implementación
(defun true-listp (object)
"Return non-`nil' if OBJECT is a true list."
(and (listp object) (null (cdr (last object)))))
(defun recursive-mapcar (func list)
"Evaluates func on elements of the list, then on elements of elements of the list and so forth."
(let ((output nil))
(flet ((comp (a b) nil)
(call-fun-and-save (x) (add-to-list 'output (funcall func x) t 'comp))
(recursion (l)
(mapcar
(lambda (x)
(call-fun-and-save x)
(if (and (true-listp x)) ;; HERE I use true-listp, testing for list or cons is not sufficient
(recursion x)))
l)))
(recursion list))
output))
Lo uso para extraer todas las etiquetas específicas del html analizado. Ejemplo de html
analizar
;; buffer 'html'
<html>
<body>
<table style="width:100%">
<tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr>
<tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr>
</table>
</body>
</html>
Luego extraigo todo <td>
como
(with-current-buffer (get-buffer "html")
(let ((data (libxml-parse-html-region (point-max) (point-min))))
;; gat only <td> tags
(-non-nil
(recursive-mapcar
(lambda(x) (and (consp x) (equal 'td (car x)) x))
data))
data
)
)
libxml-parse-html-region
y deseo extraer todas las <td>
etiquetas.
consp
lugar.
cddr
la lista (para omitir el nombre del elemento y los atributos). Una vez que haga eso, debería encontrar que todas las listas son correctas y su problema desaparecerá. También solucionará un error en su código donde puede confundir un td
atributo de un td
elemento.
true-list-p
en Elisp simplemente porque no se ha encontrado que sea lo suficientemente útil como para proporcionarlo. De hecho, no recuerdo la última vez que quise probar si una lista era correcta, así que tal vez si nos brinda un poco más de información sobre su caso de uso, podemos ayudarlo a resolver su problema de otra manera.