আমি এই জাতীয় দুটি সম্পত্তি তালিকার একীকরণের জন্য একটি আদর্শ এলিস্প লাইব্রেরি ফাংশন পাইনি:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
আমি এর সাথে কিছু তৈরি করতে পারতাম dolist
, তবে আমার কাজ করার আগে, আমি তা পরীক্ষা করে দেখতে চাই যে আমি কোনও লাইব্রেরিতে বিদ্যমান ফাংশনটি উপেক্ষা করছি না।
মন্তব্যগুলির উপর ভিত্তি করে আপডেটগুলি :
- "বহু উপায়" মন্তব্যের প্রতিক্রিয়া:
আমি কল্পনা করব যে এই জাতীয় কোনও কার্যকারিতা নেই কারণ এই প্রশ্নের উত্তর বিভিন্ন (এবং সম্ভবত বৈধ) সম্ভব রয়েছে: যখন আলাদা মান সহ আপনার নকল সম্পত্তির নাম থাকবে তখন কী করবেন?
হ্যাঁ, সদৃশগুলি কীভাবে মার্জ করা যায় সে সম্পর্কে একটি প্রশ্ন রয়েছে, তবে এটির সমাধানের তুলনামূলকভাবে কয়েকটি উপায় রয়েছে। আমি দুটি সাধারণ পন্থা দেখতে পাচ্ছি। প্রথমত, যুক্তির আদেশ নকলগুলি সমাধান করতে পারে; যেমন ক্লোজুরের সংশ্লেষের মতো ডানদিকের জয় । দ্বিতীয়ত, একীভূতকরণটি রুবির একীকরণের মতো একটি ব্যবহারকারী-সরবরাহিত কলব্যাক ফাংশনে প্রতিনিধি করতে পারে ।
যাই হোক না কেন, এটি করার বিভিন্ন উপায় রয়েছে এই সত্যটি অন্য অনেক ভাষা স্ট্যান্ডার্ড লাইব্রেরিগুলিকে মার্জ ফাংশন সরবরাহ করতে বাধা দেয় না। একই সাধারণ যুক্তি বাছাইয়ের কথা বলা যেতে পারে, এবং তবুও এলিসপ বাছাই কার্যকারিতা সরবরাহ করে।
- "আপনি বিস্তারিত বলতে পারেন?" / "দয়া করে আপনি যে আচরণটি সুনির্দিষ্টভাবে সন্ধান করছেন তা নির্দিষ্ট করুন" "
সাধারণভাবে বলতে গেলে, আমি এলিসপ সম্প্রদায় যা ব্যবহার করে তা সম্পর্কে আমি উন্মুক্ত। আপনি যদি একটি নির্দিষ্ট উদাহরণ চান, এখানে একটি উদাহরণ যা কাজ করবে:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
এবং ফিরে
'(k1 1 k2 2 k3 0))
এটি ক্লোজুরের মার্জ হওয়ার মতো, ডান-জয়ের শৈলী হবে।
- "এগুলি তালিকাগুলি, তাই কেবল সংযোজন?"
না, সম্পত্তি তালিকার শব্দার্থবিজ্ঞান append
সংরক্ষণ করে না । এই:
(append '(k1 1 k2 2) '(k2 0))
এটি ফেরত দেয়:
(k1 1 k2 2 k2 0)
অ্যাপেনড code সি উত্স কোডে একটি অন্তর্নির্মিত ফাংশন।
(সংযোজন এবং বিশ্রাম SEQUENCES)
সমস্ত তর্ক যুক্ত করুন এবং ফলাফলকে একটি তালিকা করুন। ফলাফল হ'ল একটি তালিকা যার উপাদানগুলি সমস্ত যুক্তির উপাদান। প্রতিটি যুক্তি একটি তালিকা, ভেক্টর বা স্ট্রিং হতে পারে। শেষ যুক্তিটি অনুলিপি করা হয়নি, কেবলমাত্র নতুন তালিকার লেজ হিসাবে ব্যবহৃত হয়েছে।
- "এবং আপনার উদাহরণটি মার্জ হওয়ার মতো কিছুই দেখায় না - এটি দুটি সম্পত্তি তালিকারও প্রদর্শন করে না।
হ্যাঁ এটা করে; এটি ধাপে ধাপে মার্জ করে। এটি দেখায় যে কীভাবে এলিস্পের নথিভুক্ত সম্পত্তি তালিকার ফাংশনগুলি ব্যবহার করে একীভূত করা বেদনাদায়ক ভার্বোস:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
এর থেকে ফলাফলের ফলাফলটি কেবল প্রদর্শন করুন pl
:
(key-1 value-1 key-2 value-2)
পুনরাবৃত্তি করার জন্য, আমি এই সমস্যাটি সমাধান করার জন্য একটি ফাংশন লিখতে সক্ষম, তবে আমি প্রথমে খুঁজে বের করতে চেয়েছিলাম যে এই ধরনের ফাংশন সাধারণ ব্যবহারে কোথাও উপস্থিত রয়েছে কিনা।
অবশেষে, যদি আপনি এই প্রশ্নটিকে অস্পষ্ট বলে মনে করেন তবে আপনি এই বিষয়টিকে অস্বীকার করছেন তবে আমি আপনাকে জিজ্ঞাসা করব যে আপনি এখনই পুনর্বিবেচনা করেছেন যে আমি স্পষ্ট করার জন্য কিছু চেষ্টা করেছি। এটি গবেষণার অভাব নয়। "তালিকাগুলি" সম্পর্কিত এলিস্প ডকুমেন্টেশন প্রশ্নের উত্তর দেয় না।
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
যা (:a 3 :b 2 :a 1)
আপনি কেবলমাত্র প্লিস্ট অ্যাক্সেস করার জন্য কেবল পলিট ফাংশন ব্যবহার করেন ততক্ষণ একই ।
plist-get
না plist-member
। দেখে মনে হচ্ছে তারা এ ব্যাপারে alists করার অনুরূপভাবে আচরণ: (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
। এদিকে, (plist-put '(:a "a" :b "b" :a "c") :a "d")
প্রথম :a
কীটির মান প্রতিস্থাপন করে তবে দ্বিতীয়টি নয়।
append
?