2017-07-20 25 views
6

Tôi đang làm việc trong Racket nhưng theo như tôi biết đây là trường hợp trong Đề án nói chung; bạn không thể làm một cái gì đó như thế này bởi vì chúng tôi đang cố gắng để xác định cái gì đó trong một bối cảnh biểu:Làm thế nào để xác định thực tế rất nhiều thứ dựa trên một điều kiện trong Đề án/Racket?

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

Bây giờ đối với trường hợp đặc biệt này, tôi có thể làm một cái gì đó giống như thay vì điều này:

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

Nhưng nếu bạn có một rất nhiều thứ khác nhau để xác định này được thực sự khủng khiếp, bởi vì thay vì

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

chúng tôi nhận

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

Điều này không phải là DRY vì có thể, chúng tôi liên tục lặp lại thử nghiệm cho condition. Và kết quả là nếu thay vì thử nghiệm cho condition, chúng tôi muốn kiểm tra other-condition, chúng tôi phải thực hiện thay đổi n lần cho n số lượng những thứ đang được xác định. Có cách nào tốt hơn để làm điều này, và nếu có: Làm thế nào?

Trả lời

5

Sử dụng 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

Nếu "rất nhiều" thực sự lớn, bạn có thể muốn sử dụng vợt của units.

Đầu tiên xác định một chữ ký với tất cả các biến bạn muốn xác định:

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

Sau đó, xác định đơn vị có chứa các bộ khác nhau của định nghĩa:

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

Bạn có thể chọn tự động đơn vị nào làm gọi và liên kết với tên trong chữ ký:

(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

Lợi thế của điều này trên 'giá trị xác định' là gì? – Wysaard

Các vấn đề liên quan