2015-04-30 10 views
15

Hãy xem xét ví dụ sau:Có thể `match` trong Racket có các mẫu với các biến từ một phạm vi bên ngoài?

#lang racket 

(match '(cat . doge) 
    [`(,a . ,b) 
    (match b 
    [a #t] 
    [_ #f])] 
    [_ "Not a pair"]) 

Đây là những gì tôi có thể viết nếu tôi muốn để phù hợp với cặp nơi người đứng đầu và đuôi đều giống nhau. Điều này không hoạt động mặc dù vì a thứ hai bị ràng buộc dưới dạng biến mới (và khớp với bất kỳ biến nào). Có mẫu biểu mẫu nào cho phép tôi sử dụng a bị ràng buộc trước đây từ phạm vi bên ngoài không?

Tôi biết điều này có thể đạt được theo cách sau

(match* ('cat 'doge) 
    [(a a) #t] 
    [(_ _) #f]) 

nhưng tôi vẫn muốn biết nếu có một cách để có được điều đó biến từ phạm vi bên ngoài (hoặc nếu có một lý do để không làm như vậy, giống như một số vấn đề va chạm tên tiềm năng hoặc một cái gì đó).

Trả lời

14

Sử dụng ==:

(match '(cat . doge) 
    [`(,a . ,b) 
    (match b 
    [(== a) #t] 
    [_  #f])] 
    [_ "Not a pair"]) 

Do vị trí trong các tài liệu, == rất dễ bỏ sót.

+3

Cũng dễ bỏ qua là '#: when'. Ví dụ, mệnh đề có thể là '[(cons a b) #: khi (eq? A b) #t]'. Tất nhiên '==' là đơn giản hơn trong ví dụ này. –

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