Eh bien, si vous voulez rouler le vôtre au lieu d'utiliser cl-position
, et que vous ne voulez pas traverser deux fois (en utilisant 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)))
C'est bon même pour les anciennes versions d'Emacs. Cependant, il a cette différence de comportement, que vous souhaitiez ou non: il fonctionne également pour les voitures d'une liste en pointillés. Autrement dit, il renvoie correctement la position au lieu de générer une erreur, pour les sexps tels que (nth-elt 'c '(a b c . d))
.
Si vous souhaitez toujours générer une erreur pour une liste incorrecte, alors vous voudrez vérifier ce cas, ce qui nécessite de toujours parcourir jusqu'à la fin de la liste:
(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)))