ถ้าคุณต้องการม้วนตัวเองแทนที่จะใช้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 รุ่นเก่า ๆ อย่างไรก็ตามมันมีความแตกต่างของพฤติกรรมนี้ซึ่งคุณอาจต้องการหรือไม่ต้องการ: มันใช้ได้กับรถยนต์ของรายการที่มีจุดด้วย นั่นคือมันอย่างถูกต้องจะส่งกลับตำแหน่งแทนของการเพิ่มข้อผิดพลาดสำหรับ sexps (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)))