আমি কীভাবে কোনও ভেক্টরের উপরে মানচিত্র করব এবং একটি ভেক্টর পেতে পারি?


15

আমি যে জিনিসটি খুঁজে পেয়েছি তা হ'ল কাজ

(eval `(vector ,@(mapcar #'1+ [1 2 3 4])))
=> [2 3 4 5]

কিন্তু যে মনে হয় এ পর্যন্ত খুব 'অধিকার' উপায় হতে জটিল।

উত্তর:


19

ব্যবহার করুন 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]

1
18 সেকেন্ড 'বিজয়ী' :) clযদিও গ্রন্থাগারগুলি সংকলক সতর্কতা দেয় না, যদিও? (বেশিরভাগ কারণে এফএসএফ অসুবিধাগ্রস্ত?)
শন অলরেড

1
এফডাব্লুআইডাব্লু, আমি মনে করি বাইট সংকলন সমস্যাগুলি পুনরায় clসঞ্চিত cl-libলাইব্রেরির চেয়ে পুরানো লাইব্রেরির সাথে সম্পর্কিত ছিল । আমি উদাহরণস্বরূপ বলি না, আমি (defun fnx () (cl-map 'vector #'1+ '[1 2 3 4]))এবং তারপরে কোনও সতর্কতা পাই (byte-compile 'fnx)
ড্যান

2
আপনি যদি সামঞ্জস্যতা ক্লি-লিব ব্যবহার করেন তবে আমিও মনে করি আপনি পুরানো ইমাস (24.2) এর উপর সতর্কতা পেয়ে যাবেন। যদিও আমি এটি নিয়ে উদ্বিগ্ন হব না, আপনাকে আপনার যুদ্ধগুলি বেছে নিতে হবে।
মালবারবা

16

যেহেতু আমি 18 সেকেন্ডের ব্যবধানে পরাজিত হয়েছিল, তাই ক্লাব লাইব্রেরি ছাড়াই এটি করার একটি সহজ এবং নিরাপদ উপায়। এটি উপাদানগুলির মূল্যায়নও করে না।

(apply #'vector (mapcar #'1+ [1 2 3 4])) ;; => [2 3 4 5]

এটিও বেশ সুন্দর! পুনরায়: পুরানো ইম্যাক্স সম্পর্কে আপনার পূর্ববর্তী মন্তব্য: যদি আপনাকে উত্তরাধিকারী ব্যবহারকারীদের প্রত্যাশা করতে হয় তবে এটি বিশেষত সহায়ক বলে মনে হচ্ছে। এটি আপনাকে সবচেয়ে সহায়ক বলে মনে হয় যদি আপনাকে কেবল কয়েকটি দাগে এটি ব্যবহার করতে হয়, তবে আপনি cl-libনির্ভরতা এড়ানোর বিরুদ্ধে সামান্য অসুবিধাটি বন্ধ করতে পারেন ।
ড্যান

1
খুব নিফটি !! আমি ব্যবহার সম্পর্কে ভাবিনি apply
শন অলরেড

আমি মনে করি (apply #'vector ...)যে কখনও কখনও সামান্য দ্রুত হতে পারে, তবে সম্পূর্ণতার জন্য, এটি দিয়ে প্রতিস্থাপনও করা যেতে পারে (vconcat ...)
তুলিল

1

কেসটির জন্য এত মার্জিত ইনস্প্লেস-ভেরিয়েন্ট নয় যে এর পরে মূল ভেক্টরটির আর প্রয়োজন হয় না এবং মেমরির বরাদ্দ সময়-সমালোচনা (যেমন ভেক্টরটি বড়)।

(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)

1

সম্পূর্ণতার জন্য, ব্যবহার seq:

(require 'seq)
(seq-into (seq-map #'1+ [1 2 3 4]) 'vector)

সেখান থেকে একটি মুছে ফেলা উত্তর Fólkvangr সঠিক একই সঙ্গে 2018-11-12 seq-intoলাইন। ব্যবহারকারী নিম্নলিখিত কারণে তার উত্তরটি মুছে ফেলেছেন: "আমার সমাধানটি কম প্রাসঙ্গিক কারণ সেক লাইব্রেরি অন্তর্নিহিত প্রচলিত লিস্প এক্সটেনশনগুলি ব্যবহার করে - - ফলকভাঙ্গার মে 16 ই 8:53"
টোবিয়াস

@ টোবিয়াস আমার ধারণা আমি এই যুক্তির সাথে একমত নই যাইহোক যাইহোক vconcat বা ভেক্টর ব্যবহার করে সমস্ত কিছু শেষ হতে চলেছে, তবে বিভিন্ন ইন্টারফেসের দৃষ্টান্তগুলি রেকর্ডে রাখতে দরকারী।
শন অলরেড

সমস্যা নেই. আমি সবেমাত্র ফলকভাঙ্গরের মুছে ফেলা উত্তরটি দেখতে পেয়েছি (প্রায়) আপনার সাথে মিলছে এবং আপনাকে অবহিত করতে চেয়েছিলাম। যে কোনও কারণেই মুছে ফেলা উত্তরগুলি দেখার জন্য 10000 প্রতিনিধি প্রয়োজন :-(।
টোবিয়াস

@ তোবিয়াস হ্যাঁ, আমি কখনই বুঝতে পারি নি যে এই সুযোগগুলি কেন সাইট-নির্দিষ্ট ছিল :-)
সান অলরেড

0

আপনি লুপ ব্যবহার করতে পারেন

(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])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.