Answers:
使用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)
。
为了完整起见,请使用seq
:
(require 'seq)
(seq-into (seq-map #'1+ [1 2 3 4]) 'vector)
seq-into
。用户由于以下原因删除了答案:“我的解决方案不太重要,因为seq库使用了底层的Common Lisp扩展。–Fólkvangr,5月16日,8:53”
您可以使用循环
(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令人讨厌吗?)