ฉันสับสนกับ.
สัญกรณ์จริงๆ คือ'(a . b)
รายการ?
(listp '(a . b))
ผลตอบแทนที่ได้t
แต่เมื่อฉันต้องการที่จะทราบความยาวของมันให้ข้อผิดพลาด(length '(a . b))
Wrong type argument: listp, b
เช่นเดียวกับฟังก์ชั่นอื่น ๆ เช่นnth,mapcar
อื่น ๆ พวกเขาทั้งหมดให้ข้อผิดพลาดเดียวกัน
มีฟังก์ชั่นใดบ้างที่ฉันสามารถแยกความแตกต่างระหว่าง'(a b)
และ'(a . b)
?
บริบท:ผมพบปัญหานี้เมื่อฉันต้องการที่จะใช้รุ่น recursive 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 เพียงเพราะไม่พบว่ามีประโยชน์เพียงพอที่จะให้ จริง ๆ แล้วฉันจำไม่ได้ว่าครั้งสุดท้ายที่ฉันต้องการทดสอบว่ารายการนั้นเหมาะสมหรือไม่ดังนั้นถ้าคุณให้ข้อมูลเพิ่มเติมเล็กน้อยเกี่ยวกับกรณีการใช้งานของคุณเราสามารถช่วยคุณแก้ปัญหาของคุณได้ด้วยวิธีอื่น