Estoy realmente confundido con la .notación. Es '(a . b)una lista?
(listp '(a . b))vuelve tpero cuando quiero saber su longitud (length '(a . b))da un error Wrong type argument: listp, b. Lo mismo es para otras funciones como nth,mapcaretc. 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 htmlanalizar
;; 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-regiony deseo extraer todas las <td>etiquetas.
consplugar.
cddrla 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 tdatributo de un tdelemento.
true-list-pen 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.