এলিস্পে দুটি ভেরিয়েবল অদলবদল করুন


20

ধরুন আমার আছে

(setq a 1 b 2)

আমি কিভাবে এইরূপ সূচারূভাবে মূল্যবোধের অদলবদল করতে পারেন aএবং bএকটি অস্থায়ী পরিবর্তনশীল ব্যবহার না করেই?


যদিও আমি বহু বছর আগে প্রোগ্রামিংয়ের উদাহরণগুলি থেকে অদলবদলের অপারেশনটি স্মরণ করি, তবে আমি মনে করি না যে আমার কখনও এই জাতীয় "স্যুপ" অপারেশন দরকার ছিল। সুতরাং আপনি কোথায় খুঁজে পেতে আপনার এমন একটি জিনিস প্রয়োজন?
স্টেফান

এই বার @ স্টেফান, আমি একটি ফাংশন লিখছি যাতে দুটি যুক্তি লাগে, এবং আমি নিশ্চিত করতে চাই যে প্রথম যুক্তি দুটির চেয়ে ছোট।
পাইথননট

1
@ পাইথননট, ভাল আপনি প্রথমে যুক্তিটি (min a b)দ্বিতীয় এবং দ্বিতীয়টিতে আবদ্ধ করতে পারেন (max a b)। এটি একটি সমাধান। কেউ কেউ যুক্তি দেখান যে এটির জন্য দুটি তুলনা প্রয়োজন যখন একটি পর্যাপ্ত থাকে তবে এটি ঠিক। আপনি এটিকে আরও কার্যকরী পদ্ধতিতে এখনও একটি তুলনার সাথে পরিচালনা করতে পারেন, উদাহরণস্বরূপ ডিস্ট্রাকচারিং বাইন্ড ব্যবহার করে (cl-destructuring-bind (a . b) (if (< a b) (cons a b) (cons b a)) ...)। এটি অন্য উপায়।
মার্ক করপভ

1
@ সত্য সত্য, তবে কমপক্ষে আমার কাছে, হ্যান্ড গ্রেনেড দিয়ে ঘাম ঝরছে বলে মনে হচ্ছে। cl-destructuring-bindএই কাজের জন্য একটি হাস্যকরভাবে শক্তিশালী সরঞ্জাম।
পাইথননট

উত্তর:


18

স্মৃতি যদি আমাকে ভালভাবে পরিবেশন করে এবং আপনি cl-libতখন ব্যবহার করতে ইচ্ছুক হন :

(cl-rotatef a b)

মনে রাখবেন যে সমস্যাটি সমাধানের এটি সাধারণ লিপ উপায়।


20

এটি আমি ব্যবহার করি মার্জিত আইডিয়ম ;-)।

(setq a  (prog1 b (setq b  a)))

1
আরে, এটা পরিষ্কার। পারফরম্যান্স যদি কখনও উদ্বেগজনক হয় তবে তা আমি মনে রাখব।
পাইথননট

1
বুদ্ধিমান এবং সহজ।
নাম

1
ওহ, এটি কোনওভাবেই আমার সাথে আসল নয়। তবে সম্ভবত এটিই আমি ব্যবহার করি prog1
ড্র হয়েছে

1
এটি cl-rotatefম্যাক্রোতে প্রসারিত হওয়ার চেয়ে অনেক বেশি ।
অ্যাবো-অ্যাবো

6

যদি এটি পূর্ণসংখ্যা হয়:

(setq a (logxor a b))
(setq b (logxor a b))
(setq a (logxor a b))

:)


2
সম্পূর্ণতার জন্য আপনার নিম্নলিখিত ক্লাসিকটিও অন্তর্ভুক্ত করা উচিত: a = a + b, b = a - b, a = a - b। অবশ্যই ইমাস লিস্পে অনুবাদিত :
মার্ক কার্পভ

1
সত্য, এবং সম্পূর্ণতার জন্য আমি উল্লেখ করতে পারি যে asm বা C তে XOR ট্রিক যে কোনও কাজের জন্য কাজ করে; রেজিস্টারস, মেমরি, ইনটস, ফ্লোটস, স্ট্রোকস, স্ট্রিংস (সমান দৈর্ঘ্য) ... লিস্পে আমি কেবল ইনট মনে করি। মেমরির বড় ব্লকগুলির জন্য টেম্প বাফারটির প্রয়োজন হয় না nice
jtgd

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