สิ่งเดียวที่ฉันพบว่าทำงานได้คือ
(eval `(vector ,@(mapcar #'1+ [1 2 3 4])))
=> [2 3 4 5]
แต่ที่ดูเหมือนไกลซับซ้อนเกินไปที่จะเป็นขวา '' วิธี
สิ่งเดียวที่ฉันพบว่าทำงานได้คือ
(eval `(vector ,@(mapcar #'1+ [1 2 3 4])))
=> [2 3 4 5]
แต่ที่ดูเหมือนไกลซับซ้อนเกินไปที่จะเป็นขวา '' วิธี
คำตอบ:
ใช้cl-map
แทน:
(cl-map 'vector #'1+ [1 2 3 4])
พื้นหลังพิเศษเล็ก ๆ น้อย ๆ : cl-map
เป็นฟังก์ชั่นCommon LISPmap
ที่สรุปลักษณะของลำดับ:
(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
ไลบรารีrejiggered ฉันไม่ได้เช่นได้รับคำเตือนใด ๆ เมื่อฉันแล้ว(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 ...)
แต่เพื่อความสมบูรณ์ก็ยังสามารถถูกแทนที่ด้วย
ตัวแปรภายในที่ไม่หรูหราสำหรับกรณีที่ไม่จำเป็นต้องใช้เวกเตอร์ดั้งเดิมอีกต่อไปหลังจากนั้นและการจัดสรรหน่วยความจำมีความสำคัญต่อเวลา (เช่นเวกเตอร์มีขนาดใหญ่)
(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 น่ารังเกียจ?)