Bem, se você quiser criar o seu próprio, em vez de usar cl-position
, e não quiser percorrer duas vezes (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)))
Isso é bom para versões antigas do Emacs. No entanto, possui essa diferença de comportamento, que você pode ou não querer: Funciona também para os carros de uma lista pontilhada. Ou seja, ele retorna corretamente a posição em vez de gerar um erro, para sexps como (nth-elt 'c '(a b c . d))
.
Se você sempre deseja gerar um erro para uma lista imprópria, verifique esse caso, que exige sempre a passagem para o final da 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)))