2015-04-30 11 views
15

consideri il seguente esempio:È possibile che match` in Racket abbia pattern con variabili da un ambito esterno?

#lang racket 

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

Questo è quello che potrebbe scrivere se volevo abbinare coppie dove la testa e la coda sono uguali. Questo non funziona però perché il secondo a è associato come una nuova variabile (e corrisponde a qualsiasi cosa). Esistono forme di modello che mi consentono di utilizzare lo a associato in precedenza dall'ambito esterno?

So che questo può essere realizzato nel modo seguente

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

ma io ancora vorrei sapere se c'è un modo per ottenere quella variabile dal campo esterno (o se v'è un motivo per non facendo così, come qualche potenziale problema di collisione di nome o qualcosa del genere).

risposta

14

Uso ==:

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

A causa del posizionamento nei documenti, == è facile trascurare.

+3

Anche facile da trascurare è '#: quando'. Ad esempio, la clausola potrebbe essere '[(cons a b) #: when (eq? A b) #t]'. Ovviamente '==' è più semplice in questo esempio. –