Nun, wenn Sie Ihre eigenen würfeln möchten, anstatt zu verwenden cl-position
, und Sie nicht zweimal (mit length
) durchqueren möchten ...
(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)))
Das ist auch für alte Emacs-Versionen gut. Es weist jedoch diesen Verhaltensunterschied auf, den Sie möglicherweise möchten oder nicht möchten: Es funktioniert auch für die Autos einer gepunkteten Liste. Das heißt, es gibt die Position korrekt zurück, anstatt einen Fehler auszulösen, für Sexps wie (nth-elt 'c '(a b c . d))
.
Wenn Sie für eine unzulässige Liste immer einen Fehler auslösen möchten, sollten Sie nach diesem Fall suchen, bei dem immer zum Ende der Liste übergegangen werden muss:
(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)))