Bueno, si quieres rodar el tuyo en lugar de usar cl-position
, y no quieres atravesar dos veces (usando 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)))
Eso es bueno incluso para versiones antiguas de Emacs. Sin embargo, tiene esta diferencia de comportamiento, que podría desear o no: también funciona para los automóviles de una lista de puntos. Es decir, devuelve correctamente la posición en lugar de generar un error, para sexps como (nth-elt 'c '(a b c . d))
.
Si siempre desea generar un error para una lista incorrecta, entonces querrá verificar ese caso, que requiere siempre desplazarse hasta el final de la lista:
(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)))