তালিকাকে বাঁধাই না করে সরাসরি তালিকা থেকে একাধিক মানকে বাঁধুন


12

ইমা্যাকস লিস্পে অস্থায়ী ভেরিয়েবলটি না নিয়েই কি ভেরিয়েবলগুলিতে সরাসরি একাধিক রিটার্ন মান নির্ধারণ করা সম্ভব?

উদাহরণস্বরূপ, আসুন আমি বলি যে আমার একটি ফাংশন রয়েছে যা দুটি তালিকার একটি তালিকা ফেরত দেয়:

(defun test-func ()
  (setq a '(a b))
  (setq b '(c d))
  `(,a ,b))

যদি আমি প্রথম রিটার্ন মান list-aএবং দ্বিতীয়টি ফেরতের মান নির্ধারণ করতে চাই তবে আমি list-bএকটি অস্থায়ী ভেরিয়েবল ব্যবহার করে এটি করতে পারি temp, উদাহরণস্বরূপ:

(let* ((temp (test-func)) (list-a (car temp)) (list-b (cadr temp)))
  (message-box (prin1-to-string list-a))
  (message-box (prin1-to-string list-b)))

এটি আরও সহজভাবে করা সম্ভব? (আমি পার্ল এবং পাইথনের অভ্যস্ত যেখানে আপনাকে কোনও অস্থায়ী পরিবর্তনশীল নির্দিষ্ট করতে হবে না)


2
আপনি cl-destructuring-bindম্যাক্রো চেষ্টা করতে পারেন । এছাড়াও, আপনি কি সত্যিই setqএকটি ভিতরে ব্যবহার করার ইচ্ছা ছিল defun? setqএকটি "বিশেষ" (বিশ্বব্যাপী অ্যাক্সেসযোগ্য) ভেরিয়েবল তৈরি করে, যা আপনি সাধারণত কোনও ফাংশনের বাইরে রাখতেন (কারণ একই পরিবর্তনশীলটিকে একাধিকবার ঘোষণার কিছু অর্থ নেই, যখন ফাংশনগুলি একাধিকবার চালানোর উদ্দেশ্যে তৈরি হয়)।
wvxvw

@wvxvw ধন্যবাদ! হ্যাঁ আমি letফাংশনটির ভিতরে ব্যবহার করতে ভুলে গেছি .. আমি কোনও বৈশ্বিক ভেরিয়েবল সেট করার পরিকল্পনা করিনি :)
হ্যাকন হাগল্যান্ড

উত্তর:


8

কমন লিস্পের একটি বিশেষ সুবিধা রয়েছে - একাধিক মান এবং ইমাস লিস্প সামঞ্জস্য লাইব্রেরি তালিকা ব্যবহার করে তাদের অনুকরণ করে

এইভাবে আপনি করতে পারেন

(defun test-fun ()
  (let ((a 1) (b 2))
    (cl-values a b)))

(cl-multiple-value-bind (a b) (test-fun)
  ...)

( EL- এ সমস্ত সিএল কার্যকারিতার জন্য উপসর্গটি লোড করুন cl-libএবং ব্যবহার করুন cl-)।

এনবি : আপনি যদি উপরে লিঙ্কিত এসও উত্তরটি লক্ষ্য করেন তবে আপনি দেখতে পাবেন যে তালিকার সাথে এমভি অনুকরণটি হ'ল এটি হালকাভাবে, সাবওটিমেটাল (নীচে @ স্টিফানের মন্তব্যটিও দেখুন)।


এর multiple-value-bindপরিবর্তে ব্যবহারের কোনও সুবিধা আছে cl-multiple-value-bind(কেবলমাত্র পরে ম্যানুয়াল gnu.org/software/emacs/manual/html_node/cl/ মাল্টিপল- ভারসাম html তে নথিভুক্ত করা আছে )?
হ্যাকন হাগল্যান্ড

3
@ হাকনহাগল্যান্ড They তারা একই ফাংশন, তবে আপনার পরবর্তীটি ব্যবহার করা উচিত । clপ্যাকেজ আর ব্যবহার করা বোঝানো হয় না। এর cl-libপরিবর্তে আপনার সর্বদা প্যাকেজটি ব্যবহার করা উচিত , যা cl-উপসর্গটির সাথে ফাংশনগুলি সংজ্ঞায়িত করে ..
মালাবরবা

1
আমি এর ব্যবহারের বিরুদ্ধে সুপারিশ করব cl-values: এটি কমনলিস্পের একটি "সর্বোত্তম প্রচেষ্টা" অনুকরণ, valuesতবে এটি আসলেই সামঞ্জস্যপূর্ণ না কারণ এটি সমস্ত কিছু একটি তালিকা ফিরিয়ে দেওয়া (যেমন এটি একটি মিথ্যা ধরণের), এবং আমার অভিজ্ঞতার মধ্যেই লোকেরা তাড়াতাড়ি বা শেষ পর্যন্ত শেষ করবে তালিকা হিসাবে চিহ্নিত (যেমন বিমূর্তি ভাঙ্গা): আরও ভাল ব্যবহারের তালিকা স্পষ্টভাবে ব্যবহার করুন (এবং যদি আপনি পছন্দ না করেন pcase-letতবে তার cl-destructuring-bindপরিবর্তে ব্যবহার করুন cl-multiple-value-bind)।
স্টিফান

4

cl-libসামঞ্জস্যতা প্যাকেজের উপর নির্ভর করার পাশাপাশি এর জন্য এলিস্পে প্রস্তাবিত উপায়টি হ'ল pcase:

(defun test-fun
  (let ((a '(a b))
        (b '(c d)))
    `(,a ,b)))

(defun other-test-fun ()
  (pcase-let ((`(,a ,b) (test-fun)))
    (message "a = %s; b = %s" a b)))

পাশে pcase-let, এর রয়েছে pcase-dolist, pcase-lambdaএবং pcaseনিজেই।

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