2010-11-18 20 views
15

अजगर में, मैं कुछ इस तरह कर सकते हैं:योजना के बराबर अनपॅकिंग के बराबर क्या है?

t = (1, 2) 
a, b = t 

... और एक 1 हो जाएगा और ख 2. मान लीजिए मैं इस योजना में एक सूची '(1 2) है किया जाएगा। let के साथ कुछ ऐसा करने का कोई तरीका है? यदि इससे कोई फर्क पड़ता है, तो मैं रैकेट का उपयोग कर रहा हूं।

उत्तर

24

रैकेट में आप match उपयोग कर सकते हैं,

(define t (list 1 2)) 
(match [(list a b) (+ a b)]) 

और match-define जैसे संबंधित बातें:

(match-define (list a b) (list 1 2)) 

और match-let

(match-let ([(list a b) t]) (+ a b)) 

कि सूचियों, वैक्टर, structs, आदि के लिए काम करता है आदि। कई मानों के लिए, आपका उपयोग करेंगे:

(define (t) (values 1 2)) 
(define-values (a b) (t)) 

या let-values। लेकिन ध्यान दें कि मैं t को "टुपल" के रूप में परिभाषित नहीं कर सकता क्योंकि कई मान (अधिकांश) योजना कार्यान्वयन में प्रथम श्रेणी मान नहीं हैं।

+0

यह काम करता है, लेकिन मैं कुछ ऐसा ढूंढ रहा था जो 'चलो' इस्तेमाल करता था, और यह 'इसे परिभाषित करता है'। मुझे लगता है कि मैं एक मैक्रो लिख सकता हूं जो इस तरह की परिभाषा को 'स्थानीय' में विभाजित करता है। –

+2

ठीक है, 'मिलान-चलो' (उदाहरण के साथ अपडेट किया गया) है, लेकिन एक सरल 'मिलान' भी कर सकता है। (आपका प्रश्न यह आपके जैसा दिखता है * चाहता था * परिभाषाएं।) इसके अलावा, आप हमेशा स्थानीय दायरे में परिभाषाओं का उपयोग कर सकते हैं। –

4

मुझे लगता है कि यह आपके लिए क्या देख रहे है: let-values या let+ पर

देखो।

+0

इसे पोस्ट करने के लिए धन्यवाद! एकमात्र चीज यह है कि 'लेट-वैल्यू' * ऐसा नहीं करता जो मैं चाहता हूं कि मैं ऐसा करूं, और मुझे लगता है कि 'लेट +' काम करने के लिए आवश्यक पुस्तकालय नहीं मिल रहा है। उस ने कहा, यह "पायथन प्रोग्रामर के लिए योजना" वेबसाइट निश्चित रूप से काम में आ जाएगी। –

+0

ठीक है, कम से कम आपके पास अन्य समस्याओं में भाग लेने के माध्यम से खोदने के लिए एक अच्छी नई साइट है। इसे देखें, आशा है कि आप पाएंगे कि 'पर्यावरण +' के लिए अपना पर्यावरण कैसे स्थापित करें। चीयर्स। –

5

आप जो खोज रहे हैं (कम से कम लिस्प-दुनिया में) के लिए सामान्य शब्द destructuring और एक मैक्रो को लागू करता है कि यह रूप में destructuring-बाँध जाना जाता है। कॉमन लिस्प में, यह इस तरह से काम करता है:

(destructuring-bind (a b c) '(1 2 3) 
    (list a b c)) ;; (1 2 3) 

यह भी कई घोंसले के "स्तर" के लिए काम करता है:

(destructuring-bind (a (b c) d) '(1 (2 3) 4) 
    (list a b c d)) ;; (1 2 3 4) 

ऐसा लगता है कि वहाँ की तरह एक योजना मैक्रो के रूप में destructuring-बाँध के एक nice implementation

(define t '(1 2)) 
(apply (lambda (a b) 
      ;; code that would go inside let 
     ) 
     t) 

लाभ यह है कि पर काम करता है है:

5

एक नंगे हड्डियों मुहावरा उपयोग करने के लिए लैम्ब्डा आप उपयोग करेंगे जहां करते हैं, की तरह साथ लागू है कोई कार्यान्वयन बेशक इसका उपयोग केवल साधारण मामलों पर किया जा सकता है, लेकिन कभी-कभी आपको इसकी आवश्यकता होती है।

संबंधित मुद्दे