Elisp में दो वैरिएबल स्वैप करें


20

मान लो मेरे पास है

(setq a 1 b 2)

मैं अस्थायी रूप से चर का उपयोग किए बिना aऔर उसके मूल्यों को कैसे बदल सकता हूं b?


जबकि मुझे कई सालों पहले प्रोग्रामिंग उदाहरणों से स्वैप ऑपरेशन याद है, मुझे नहीं लगता कि मुझे कभी ऐसे "स्वैप" ऑपरेशन की आवश्यकता है। तो आपको कहां लगता है कि आपको ऐसी चीज़ की ज़रूरत है?
स्टीफन

@ इस बार, मैं एक फ़ंक्शन लिख रहा हूं जिसमें दो तर्क दिए गए हैं, और मैं यह सुनिश्चित करना चाहता हूं कि पहला तर्क दो में से छोटा हो।
पायथनऑनट

1
@PythonNut, अच्छी तरह से आप पहले तर्क को (min a b)और दूसरे को बांध सकते हैं (max a b)। यह एक उपाय है। कुछ लोग यह तर्क देंगे कि जब कोई पीड़ित होता है तो उसे दो तुलनाओं की आवश्यकता होती है। आप इसे और अधिक कार्यात्मक तरीके से एक तुलना के साथ संभाल सकते हैं, उदाहरण के लिए विनाशकारी बाइंड का उपयोग करके (cl-destructuring-bind (a . b) (if (< a b) (cons a b) (cons b a)) ...)। यह एक और तरीका है।
मार्क कारपोव

1
@ मर्क सच है, लेकिन, कम से कम मेरे लिए, ऐसा लगता है कि स्वाटिंग हथगोले के साथ उड़ती है। cl-destructuring-bindइस काम के लिए एक हास्यास्पद शक्तिशाली उपकरण है।
PythonNut

जवाबों:


18

यदि स्मृति मेरी अच्छी सेवा करती है और आप cl-libतब उपयोग करने के लिए तैयार हैं :

(cl-rotatef a b)

ध्यान दें कि यह समस्या को हल करने का सामान्य लिस्प तरीका है।


20

यह मैं उपयोग सुंदर मुहावरे ;-) है।

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

1
अरे, यह साफ है। अगर प्रदर्शन कभी चिंता का विषय है तो मैं इसे ध्यान में रखूंगा।
PythonNut

1
सरल और सरल।
नाम

1
ओह, यह मेरे साथ मूल नहीं है, किसी भी तरह से। लेकिन यह संभवत: मुख्य उपयोग है जिसे मैं बनाता हूं prog1
आकर्षित किया

1
यह बहुत ज्यादा है जो cl-rotatefमैक्रो के लिए फैलता है।
abo-abo

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। इमैक लिस्प में अनुवादित, निश्चित रूप से :-D
मार्क कारपोव

1
सच है, और पूर्णता के लिए मैं बताऊंगा कि asm या C में XOR ट्रिक कुछ भी काम करती है; रजिस्टरों, मेमोरी, इन्टस, फ्लोट्स, स्ट्रक्चर्स, स्ट्रिंग्स (समान लंबाई) ... लिस्प में मैं केवल इनट्स सोचता हूं। मेमोरी के बड़े ब्लॉक के लिए यह अस्थायी बफर की आवश्यकता नहीं है।
jtgd

@jtgd: मेमोरी के बड़े ब्लॉक्स के लिए, आप एक छोटे बफर के साथ स्वैप सेगमेंट-बाय-सेगमेंट कर सकते हैं।
क्लेमेंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.