2013-07-14 5 views
2

Я пытаюсь понять документ соответствия шаблону ракеты и задать несколько вопросов, как показано ниже, я не могу его разобрать.Синтаксис синтаксиса синтаксиса квазикота и вопросительного знака

  • (quasiquote qp) - вводит квазипереход, в котором идентификаторы соответствуют символам. Подобно форме выражения квазиквадрата, 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

Если вы не знакомы с квазикотанием, то вам может понравиться list узоров в match, а затем узнать о квазикотировании в целом. Тогда было бы легче понять, что собрать вместе.

Почему? Потому что квазикот является «только» сокращением или альтернативой тому, что вы можете написать с помощью list. Хотя я не знаю реальной истории развития, я полагаю, что автор (ы) match начал с шаблонов, таких как 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 
Смежные вопросы