ठीक है, अगर आप का उपयोग करने के बजाय अपने रोल करना चाहते हैं cl-position
, और आप दो बार (का उपयोग कर length
) पार नहीं करना चाहते हैं ...
(defun nth-elt (element xs)
"Return zero-indexed position of ELEMENT in list XS, or nil if absent."
(let ((idx 0))
(catch 'nth-elt
(dolist (x xs)
(when (equal element x) (throw 'nth-elt idx))
(setq idx (1+ idx)))
nil)))
यह पुराने Emacs संस्करणों के लिए भी अच्छा है। हालाँकि, इसमें यह व्यवहार भिन्नता है, जिसे आप चाहते हैं या नहीं भी कर सकते हैं: यह एक बिंदीदार सूची की कारों के लिए भी काम करता है। यही है, यह सही ढंग से एक त्रुटि को बढ़ाने के बजाय स्थिति देता है, जैसे कि सेक्सप्स के लिए (nth-elt 'c '(a b c . d))
।
यदि आप हमेशा अनुचित सूची के लिए कोई त्रुटि चाहते हैं, तो आप उस मामले की जांच करना चाहेंगे, जिसके लिए हमेशा सूची के अंत तक ट्रेसिंग की आवश्यकता होती है:
(defun nth-elt (element xs)
"Return zero-indexed position of ELEMENT in list XS, or nil if absent."
(let ((idx 0))
(when (atom (cdr (last xs))) (error "Not a proper list"))
(catch 'nth-elt
(dolist (x xs)
(when (equal element x) (throw 'nth-elt idx))
(setq idx (1+ idx)))
nil)))