나는 실제로 .
표기법 과 혼동 됩니다. 가 '(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있다. 사실, 목록이 올바른지 테스트하고 싶었던 마지막 시간을 기억할 수 없으므로 사용 사례에 대해 조금 더 많은 정보를 제공하면 다른 방법으로 문제를 해결할 수 있습니다.