답변:
(cl-position 2 '(6 7 8 2 3 4)) ;; => 3
(Emacs 24.3 이전에는 Emacs 에 포함 된 position
library의 함수 를 사용하십시오 cl.el
.)
:test
키워드를 사용하여 비교 기능을 지정할 수 있습니다 .
(cl-position "bar" '("foo" "bar" "baz") :test 'equal) ;; => 1
(cl-position '(1 2) '((3) (5 6) (1 2) nil) :test 'equal) ;; => 2
dash.el
이것을 할 수있는 기능이 있습니다 : -elem-index
(-elem-index 2 '(6 7 8 2 3 4)) ;; => 3
(-elem-index "bar" '("foo" "bar" "baz")) ;; => 1
(-elem-index '(1 2) '((3) (5 6) (1 2) nil)) ;; => 2
그것은 이맥스에 포함되어 있지만, 이맥스 많은 사용자가 이미 설치되어있는 것 (그것은의 종속성의 projectile
, flycheck
그리고 smartparens
그것을 적용 범위의 톤을 제공하는).
글쎄,을 사용하는 대신 자신의 롤을 원 cl-position
하고을 사용하여 두 번 횡단하고 싶지 않은 경우 ( 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)))
구 Emacs 버전에도 좋습니다. 그러나이 동작 차이는 사용자가 원하거나 원하지 않을 수도 있습니다. 점으로 구분 된 자동차에도 적용됩니다. 즉,과 같은 sexps의 경우 오류를 발생시키는 대신 위치를 올바르게 반환합니다 (nth-elt 'c '(a b c . d))
.
부적합한 목록에 대해 항상 오류를 발생 시키려면 해당 목록을 항상 확인해야합니다.이 경우 항상 목록 끝으로 순회해야합니다.
(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)))