2015-04-30 19 views
15

Aşağıdaki örneği inceleyin:Racket'te "eşleştir" seçeneği, dış kapsamdaki değişkenlere sahip kalıplara sahip olabilir mi?

#lang racket 

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

Bu benim baş ve kuyruk aynı çift maç isteseydim yazabiliriz budur. Bu işe yaramaz çünkü ikinci a yeni bir değişken olarak bağlanır (ve herhangi bir şeyle eşleşir). Önceden bağlı olan a'u dış alandan kullanmamı sağlayan herhangi bir desen formu var mı?

Bunu şu şekilde

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

elde edilebilir ama hala orada dış kapsamdan o değişkeni almak için bir yol (veya olmadığını bilmek istiyorum bilmiyor için bir neden varsa Bunu yapmak, bazı potansiyel isim çarpışma problemi veya bir şey gibi).

cevap

14

Kullanım ==:

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

nedeniyle dokümanlar yerleşime, == gözden kaçırmak kolaydır.

+3

Ayrıca gözden kaçırmak kolaydır: #:. Örneğin, yan tümce şu olabilir: [(cons a b) #: ne zaman (eq? A b) #t] '. Tabii ki bu örnekte == 'daha basittir. –