我正在尝试了解球拍的模式匹配文档,并且有一些如下问题,我无法解析它。
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))
,是否需要列表成员之间的逗号?特别是`(,
?为什么那样?字符串!
谢谢!
答案 0 :(得分:4)
如果您不熟悉quasiquoting,那么您可能会对list
中的match
模式感到满意,然后了解一般的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