Cóż, jeśli chcesz rzucić własny zamiast używać cl-position
i nie chcesz przechodzić dwa razy (używając 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)))
To jest dobre nawet dla starszych wersji Emacsa. Ma jednak tę różnicę w zachowaniu, której możesz chcieć lub nie: Działa to również w przypadku samochodów z listy z kropkami. Oznacza to, że poprawnie zwraca pozycję zamiast zgłaszania błędu, dla sexps takich jak(nth-elt 'c '(a b c . d))
.
Jeśli chcesz zawsze zgłaszać błąd związany z niewłaściwą listą, musisz sprawdzić tę sprawę, która wymaga zawsze przejścia do końca listy:
(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)))