2017-07-20 15 views
6

Racket'ta çalışıyorum ama bildiğim kadarıyla bu genel olarak Şemadaki durumdur; Eğer bir varsaŞema/Racket'teki bir koşula dayalı olarak birçok şeyi pratik olarak nasıl tanımlarsınız?

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

Ama: Ben artık şöyle bir şeyler yapabileceğini Bu özel durumla Şimdi

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

: Eğer biz bir ifade bağlamında bir şeyler tanımlamaya çalışıyoruz çünkü böyle bir şey yapamaz yerine

(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"))) 

biz

olsun, çünkü bu tanımlamaya farklı şeyler sürü gerçekten korkunç olur
(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")) 

Olduğu gibi DRY değil, biz sürekli test için condition tekrarlıyoruz. Ve sonuç olarak, condition için test etmek yerine other-condition'u kontrol etmek istiyorsak, n için n arası değişiklik yapmak zorundayız. Bunu yapmanın daha iyi bir yolu var mı, eğer öyleyse: Nasıl?

cevap

5

Kullanım define-values:

"çok" gerçekten büyükse
(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

, sen Raket en units kullanmak isteyebilirsiniz.

(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")) 

dinamik seçebilirsiniz: Sonra tanımların farklı kümeler içeren birimleri tanımlamak

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

:

İlk Tanımlamak istediğiniz tüm değişkenler bir imza tanımlamak , hangi birimi çağırır ve imzadaki isimlere bağlanır:

(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

Bu "tanım değerleri" üzerinden bunun avantajı ne olurdu? – Wysaard

İlgili konular