如果您不熟悉 quasiquoting,那么您可能会熟悉 中的list
模式match
,然后了解一般的 quasiquoting。然后将两者放在一起会更容易理解。
为什么?因为 quasiquote “仅”是您可以使用list
. 虽然我不知道实际的开发历史,但我想作者是从,等match
模式开始的。然后有人指出,“嘿,有时我更喜欢描述使用 quasiquoting”,他们也添加了 quasiquoting。list
cons
struct
list
#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