답변:
cl-map
대신을 사용하십시오 .
(cl-map 'vector #'1+ [1 2 3 4])
약간의 추가 배경 : 시퀀스 유형으로 일반화 cl-map
하는 Common Lisp map
함수 입니다.
(cl-map 'vector #'1+ '[1 2 3 4]) ;; ==> [2 3 4 5]
(cl-map 'list #'1+ '(1 2 3 4)) ;; ==> (2 3 4 5)
(cl-map 'string #'upcase "abc") ;; ==> "ABC"
또한 시퀀스 유형간에 변환 할 수도 있습니다 (예 : 입력은 목록이고 출력은 벡터입니다).
(cl-map 'vector #'1+ '(1 2 3 4)) ;; ==> [2 3 4 5]
cl
동기화 된 라이브러리가 아닌 이전 라이브러리 와 관련이 있다고 생각합니다 cl-lib
. 예를 들어, 나는 (defun fnx () (cl-map 'vector #'1+ '[1 2 3 4]))
그때에 경고를받지 않습니다 (byte-compile 'fnx)
.
내가 18 초 뛰었으므로 cl 라이브러리없이 간단하고 안전하게 할 수있는 방법이 있습니다. 또한 요소를 평가하지 않습니다.
(apply #'vector (mapcar #'1+ [1 2 3 4])) ;; => [2 3 4 5]
cl-lib
종속성 을 피하는 것과 약간의 불편 함을 줄일 수 있습니다 .
apply
.
(apply #'vector ...)
조금 더 빠를 것이라고 생각 하지만, 완전성을 위해로 바꿀 수도 있습니다 (vconcat ...)
.
원래 벡터가 더 이상 필요하지 않고 메모리 할당이 시간 결정적인 경우 (예를 들어, 벡터가 큰 경우)에 대해 그다지 우아하지 않은 inplace-variant입니다.
(setq x [1 2 3 4])
(cl-loop for var across-ref x do
(setf var (1+ var)))
결과는에 저장됩니다 x
. x
마지막에 양식을 반환해야하는 경우 finally return x
다음과 같이 추가 할 수 있습니다 .
(cl-loop for var across-ref x do
(setf var (1+ var))
finally return x)
완전성을 위해 다음을 사용하십시오 seq
.
(require 'seq)
(seq-into (seq-map #'1+ [1 2 3 4]) 'vector)
루프를 사용할 수 있습니다
(let ((v (vector 1 2 3 4)))
(dotimes (i (length v))
(aset v i (1+ (aref v i))))
v)
;; => [2 3 4 5]
원본 벡터를 수정하고 싶지 않은 경우 복사본을 만들 수 있습니다
(let* ((v0 (vector 1 2 3 4))
(v (copy-sequence v0)))
(dotimes (i (length v))
(aset v i (1+ (aref v i))))
(list v0 v))
;; => ([1 2 3 4] [2 3 4 5])
처음부터 새로운 벡터를 만들거나
(let* ((v0 (vector 1 2 3 4))
(v (make-vector (length v0) nil)))
(dotimes (i (length v))
(aset v i (1+ (aref v0 i))))
(list v0 v))
;; => ([1 2 3 4] [2 3 4 5])
cl
라이브러리에 컴파일러 경고가 표시되지 않습니까? (대부분 FSF가 불분명하기 때문에?)