我对.
表示法感到困惑。是'(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 中没有任何功能,只是因为尚未发现它足以提供它。的确,我不记得上一次我想测试列表是否正确,因此,如果您向我们提供有关用例的更多信息,我们可能会以另一种方式帮助您解决问题。