मैं वास्तव में .
संकेतन के साथ भ्रमित हूँ । है '(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
एलीस्प में कोई बस नहीं है क्योंकि इसे उपलब्ध कराने के लिए पर्याप्त उपयोगी नहीं पाया गया है। वास्तव में, मुझे याद नहीं है कि पिछली बार मैं परीक्षण करना चाहता था कि क्या कोई सूची उचित थी, इसलिए यदि आप हमें अपने उपयोग-मामले के बारे में कुछ और जानकारी देते हैं तो हम आपकी समस्या को दूसरे तरीके से हल करने में मदद कर सकते हैं।