Ich bin wirklich verwirrt mit der .Notation. Ist '(a . b)eine Liste?
(listp '(a . b))kehrt taber 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,mapcarusw. 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 htmldas 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-regionund alle <td>Tags extrahieren möchte .
conspstattdessen.
cddrder 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 tdAttribut für ein tdElement verwechseln können .
true-list-pin 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.