ঠিক আছে, যদি আপনি ব্যবহার 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)))
এটি পুরানো ইমাস সংস্করণগুলির জন্যও ভাল। তবে, এর আচরণগত পার্থক্য রয়েছে, যা আপনি হয়ত বা না চাইতে পারেন: এটি একটি বিন্দুযুক্ত তালিকার গাড়িগুলির জন্যও কাজ করে। এটি, যেমন যৌনতার জন্য ত্রুটি বাড়ানোর পরিবর্তে সঠিকভাবে অবস্থানটি ফিরিয়ে দেয় (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)))