Chà, nếu bạn muốn tự lăn thay vì sử dụng cl-position
và bạn không muốn đi qua hai lần (sử dụng 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)))
Điều đó tốt cho cả các phiên bản Emacs cũ. Tuy nhiên, nó có sự khác biệt về hành vi này, điều mà bạn có thể muốn hoặc không muốn: Nó cũng hoạt động đối với những chiếc xe trong danh sách chấm. Đó là, nó trả lại chính xác vị trí thay vì đưa ra một lỗi, đối với giới tính như (nth-elt 'c '(a b c . d))
.
Nếu bạn muốn luôn đưa ra một lỗi cho danh sách không phù hợp, thì bạn sẽ muốn kiểm tra trường hợp đó, yêu cầu luôn luôn đi qua cuối danh sách:
(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)))