Kullanmak yerine kendi başınızı döndürmek cl-position
istiyorsanız ve iki kez (kullanarak length
) geçmek istemiyorsanız ...
(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)))
Eski Emacs sürümleri için bile iyi. Ancak, isteyebileceğiniz veya istemediğiniz bu davranış farkı vardır: Noktalı listenin arabaları için de çalışır. Yani, sexps gibi bir hata oluşturmak yerine pozisyonu doğru bir şekilde döndürür (nth-elt 'c '(a b c . d))
.
Yanlış bir liste için her zaman bir hata oluşturmak istiyorsanız, o zaman listenin sonuna gitmeyi gerektiren bu durumu kontrol etmek istersiniz:
(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)))