2013-07-14 66 views
2

我想了解球拍的模式匹配文件,並有像下面這樣的問題,我無法解析它。球拍匹配語法quasiquote和問號

  • (quasiquote qp) - 引入了一個quasipattern,其中標識符匹配符號。就像quasiquote表達形式一樣,unquote和unquote-splicing可以逃回正常模式。

http://docs.racket-lang.org/reference/match.html

例子:

> (match '(1 2 3) 
    [`(,1 ,a ,(? odd? b)) (list a b)]) 

'(2 3) 

它並不能解釋這個例子中,如何 「標識符匹配符號」?我猜這是匹配'(1 2 3)模式'(1, a, b)和b是奇數,但爲什麼`(,1 ,a ,(? odd? b))不是`(1 a (? odd? b)),乳清它需要在列表成員之間的逗號?特別是`(,?爲什麼這樣?所以弦!

謝謝!

回答

4

如果您不熟悉quasiquoting,那麼您可以在match中熟悉list模式,然後瞭解一般情況下的quasiquoting。然後將兩者結合起來會更容易理解。

爲什麼?因爲quasiquote是「僅」的縮寫或替代品,您可以使用list來寫。雖然我不知道實際的發展歷史,但我認爲match的作者從list,cons,struct等模式開始。然後有人指出,「嘿,有時我更喜歡用quasiquoting來描述list」他們也加了quasiquoting。

#lang racket 

(list 1 2 3) 
; '(1 2 3) 
'(1 2 3) 
; '(1 2 3) 

(define a 100) 
;; With `list`, the value of `a` will be used: 
(list 1 2 a) 
; '(1 2 100) 
;; With quasiquote, the value of `a` will be used: 
`(1 2 ,a) 
; '(1 2 100) 
;; With plain quote, `a` will be treated as the symbol 'a: 
'(1 2 a) 
; '(1 2 a) 

;; Using `list` pattern 
(match '(1 2 3) 
    [(list a b c) (values a b c)]) 
; 1 2 3 

;; Using a quasiquote pattern that's equivalent: 
(match '(1 2 3) 
    [`(,a ,b ,c) (values a b c)]) 
; 1 2 3 

;; Using a quote pattern doesn't work: 
(match '(1 2 3) 
    ['(a b c) (values a b c)]) 
; error: a b c are unbound identifiers 

;; ...becuase that pattern matches a list of the symbols 'a 'b 'c 
(match '(a b c) 
    ['(a b c) #t]) 
; #t