.
Gösterimle gerçekten kafam karıştı . Mı '(a . b)
bir liste?
(listp '(a . b))
döner t
ancak uzunluğunu bilmek istediğimde (length '(a . b))
bir hata veriyor Wrong type argument: listp, b
. Aynı şey, nth,mapcar
vb. Gibi diğer işlevler için de aynı hatayı verir.
Ben ayırt edebilir bir fonksiyon var mıdır '(a b)
ve '(a . b)
?
Bağlam: özyinelemeli sürümünü uygulamak istediğimde bu sorunla karşılaştım mapcar
. İşte benim uygulama
(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))
Ayrıştırılmış html tüm özel etiketleri ayıklamak için bunu kullanın. html
Ayrıştırma örneği
;; 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>
Sonra bütün ayıklamak <td>
olarak
(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
ve tüm <td>
etiketleri ayıklamak istediğimde kullanışlıdır .
consp
yerine.
cddr
(öğe adını ve niteliklerini atlamak için). Bunu yaptıktan sonra, tüm listelerin uygun olduğunu ve probleminizin kaybolacağını bulmalısınız. Ayrıca, kodunuzdaki td
bir td
öğenin özniteliğini karıştırabileceğiniz bir hatayı da düzeltir .
true-list-p
Elisp'de hayır yoktur , çünkü bunu sağlamak için yeterince yararlı bulunmamıştır. Gerçekten, bir listenin uygun olup olmadığını en son test etmek istediğimi hatırlamıyorum, belki de kullanım durumunuz hakkında bize biraz daha bilgi verirseniz, sorununuzu başka bir şekilde çözmenize yardımcı olabiliriz.