2017-07-20 16 views
6

मैं रैकेट में काम कर रहा हूं लेकिन जहां तक ​​मुझे पता है कि यह सामान्य रूप से योजना में मामला है; आप कुछ इस तरह नहीं कर सकते, क्योंकि हम एक अभिव्यक्ति के संदर्भ में कुछ परिभाषित करने के लिए कोशिश कर रहे हैं: अबयोजना/रैकेट में किसी शर्त के आधार पर बहुत सी चीजों को व्यावहारिक रूप से परिभाषित करने के लिए कैसे?

(if condition 
    (define x "do a backflip") 
    (define x "do a barrel roll")) 

मैं इस बजाय की तरह कुछ कर सकता है इस विशेष मामले के लिए:

(define x 
    (if condition 
     "do a backflip" 
     "do a barrel roll")) 

लेकिन यदि आप एक है अलग अलग बातें इस परिभाषित करने के लिए की बहुत, वास्तव में भयानक हो जाता है क्योंकि बजाय

(if condition 
    (begin (define x "do a backflip") 
      (define y "awesome") 
      (define z "shoot me")) 
    (begin (define x "do a barrel roll") 
      (define y "nice") 
      (define z "give me sweet release"))) 

हम

मिल
(define x                                                          
    (if condition 
     "do a backflip" 
     "do a barrel roll")) 
(define y                                                          
    (if condition 
     "awesome" 
     "nice")) 
(define z                                                          
    (if condition 
     "shoot me" 
     "give me sweet release")) 

जो डीआरवाई के रूप में नहीं हो सकता है, हम लगातार condition के लिए परीक्षण दोहरा रहे हैं। और नतीजा यह है कि यदि condition के लिए परीक्षण करने की बजाय हम other-condition के लिए जांचना चाहते हैं, तो हमें n के लिए n के लिए परिवर्तनों की मात्रा को परिभाषित करना होगा। ऐसा करने का कोई बेहतर तरीका है, और यदि ऐसा है तो कैसे?

उत्तर

5

उपयोग define-values:

(define-values (x y z) (if condition 
          (values "do a backflip" "awesome" "shoot me") 
          (values "do a barrel roll" "nice" "give me sweet release"))) 
4

हैं "एक बहुत" वास्तव में बड़ा है, आप रैकेट के units उपयोग करने के लिए चाहते हो सकता है।

(define-unit [email protected] 
    (import) (export acro^) 
    (define x "do a backflip") 
    (define y "awesome") 
    (define z "shoot me")) 

(define-unit [email protected] 
    (import) (export acro^) 
    (define x "do a barrel roll") 
    (define y "nice") 
    (define z "give me sweet release")) 

आप गतिशील रूप से चयन कर सकते हैं: फिर इकाइयों कि परिभाषाओं के विभिन्न सेट शामिल परिभाषित

(define-signature acro^ (x y z)) 

:

पहले सभी चर आप को परिभाषित करना चाहते के साथ एक हस्ताक्षर को परिभाषित कौन सा यूनिट का आह्वान करता है और हस्ताक्षर में नामों से जुड़ता है:

(define-values/invoke-unit 
    (if .... [email protected] [email protected]) 
    (import) (export acro^)) 

x 
;; => either "do a backflip" or "do a barrel roll", depending on condition 
+0

'परिभाषित मूल्यों' पर इसका क्या फायदा होगा? – Wysaard

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

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