2

我正在尝试了解球拍的模式匹配文档,并且有一些类似以下的问题,我无法解析它。

  • (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

1 回答 1

5

如果您不熟悉 quasiquoting,那么您可能会熟悉 中的list模式match,然后了解一般的 quasiquoting。然后将两者放在一起会更容易理解。

为什么?因为 quasiquote “仅”是您可以使用list. 虽然我不知道实际的开发历史,但我想作者是从,等match模式开始的。然后有人指出,“嘿,有时我更喜欢描述使用 quasiquoting”,他们也添加了 quasiquoting。listconsstructlist

#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
于 2013-07-14T13:49:55.307 回答