जवाबों:
cl-map
इसके बजाय, उपयोग करें :
(cl-map 'vector #'1+ [1 2 3 4])
एक छोटी सी अतिरिक्त पृष्ठभूमि: cl-map
है कॉमन लिस्प 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 सेकंड से हराया गया था, इसलिए यहां सीएल लाइब्रेरी के बिना इसे करने का एक सरल और सुरक्षित तरीका है। यह तत्वों का मूल्यांकन भी नहीं करता है।
(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 अप्रिय है?)