Ich bin wirklich verwirrt mit der .
Notation. Ist '(a . b)
eine Liste?
(listp '(a . b))
kehrt t
aber zurück wenn ich wissen will wie lang es ist (length '(a . b))
gibt es einen fehler Wrong type argument: listp, b
. Das Gleiche gilt für andere Funktionen wie nth,mapcar
usw. Sie geben alle den gleichen Fehler aus
Gibt es eine Funktion, die ich zwischen '(a b)
und unterscheiden kann '(a . b)
?
Kontext: Ich bin auf dieses Problem gestoßen, als ich die rekursive Version von implementieren wollte mapcar
. Hier ist meine Implementierung
(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))
Ich benutze dieses, um alle spezifischen Umbauten von analysiertem HTML zu extrahieren. Beispiel für html
das Parsen
;; 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>
Dann extrahiere ich alles <td>
als
(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
und alle <td>
Tags extrahieren möchte .
consp
stattdessen.
cddr
der Liste (um den Elementnamen und die Attribute zu überspringen). Sobald Sie das tun, sollten Sie feststellen, dass alle Listen korrekt sind und Ihr Problem verschwindet. Es behebt auch einen Fehler in Ihrem Code, durch den Sie ein td
Attribut für ein td
Element verwechseln können .
true-list-p
in Elisp, nur weil es nicht nützlich genug ist, um es bereitzustellen. In der Tat kann ich mich nicht erinnern, wann ich das letzte Mal testen wollte, ob eine Liste korrekt war. Wenn Sie uns also ein bisschen mehr Informationen zu Ihrem Anwendungsfall geben, können wir Ihnen helfen, Ihr Problem auf andere Weise zu lösen.