Nah, jika Anda ingin menggulung sendiri alih-alih menggunakan cl-position
, dan Anda tidak ingin melintasi dua kali (menggunakan 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)))
Itu bagus bahkan untuk versi Emacs lama. Namun, ini memiliki perbedaan perilaku ini, yang Anda mungkin atau mungkin tidak ingin: Ini berfungsi juga untuk mobil-mobil dari daftar bertitik. Artinya, itu dengan benar mengembalikan posisi daripada meningkatkan kesalahan, untuk sexps seperti (nth-elt 'c '(a b c . d))
.
Jika Anda ingin selalu meningkatkan kesalahan untuk daftar yang tidak benar, maka Anda ingin memeriksa untuk kasus itu, yang mengharuskan selalu melintasi ke akhir daftar:
(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)))