私はこの.
表記法と本当に混同しています。'(a . b)
リストはありますか?
(listp '(a . b))
戻りますt
が、その長さを知りたいときに(length '(a . b))
エラーが発生しますWrong type argument: listp, b
。他の関数nth,mapcar
なども同じです。すべて同じエラーが発生します
私は区別することができます任意の関数があり'(a b)
とは'(a . b)
?
コンテキスト:の再帰バージョンを実装しようとしたときに、この問題が発生しましたmapcar
。これが私の実装です
(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))
これを使用して、解析されたhtmlからすべての特定のタグを抽出します。html
解析する例
;; 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>
次に、すべてを次の<td>
ように抽出します
(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
すべての<td>
タグを抽出したい場合に便利です。
consp
代わりに。
cddr
(要素名と属性をスキップするため)。これを行うと、すべてのリストが適切であり、問題が解消されることがわかります。またtd
、td
要素の属性を混同する可能性のあるコードのバグも修正します。
true-list-p
、それを提供するために有用な十分であることが判明していなかったというだけの理由elispの中で。実際、リストが適切かどうかを最後にテストしたかったのを思い出せないので、ユースケースについてもう少し情報を提供していただければ、別の方法で問題を解決するのに役立ちます。