如何匹配,在Racket中匹配?

时间:2012-07-27 03:08:58

标签: scheme racket

如果我有这样的话 (define s (hi,there)) 那我怎么写比赛 喜欢 (match s [(,h , ,t)] ...) 但它不起作用,因为match需要,所以我该怎么办呢?

3 个答案:

答案 0 :(得分:7)

首先请注意,逗号,是特殊的读者缩写。 (hi,there)的读数为(hi (unquote there))。这是 很难发现 - 因为默认打印机打印列表 其第一个元素是特殊方式的unquote

Welcome to DrRacket, version 5.3.0.14--2012-07-24(f8f24ff2/d) [3m].
Language: racket.
> (list 'hi (list 'unquote 'there))
'(hi ,there)

因此,您需要的模式是'(列表h(列表'不引用t))'。

> (define s '(hi,there))
> (match s [(list h (list 'unquote t)) (list h t)])
(list 'hi 'there)

答案 1 :(得分:2)

如果要在引用部分中使用逗号作为符号,请使用反斜杠:

> (define s '(hi \, there))
> (match s [(list h c t) (symbol->string c)])
","

并使用'|,|作为独立的逗号符号。

> (match s [(list h '|,| t) (list h t)])
'(hi there)

在任何一种情况下,你都应该使用空格来分隔事物,并使用列表。

(define s (hi,there))无效的球拍。

答案 2 :(得分:1)

我想你可能会对你需要逗号的地方感到困惑。在Racket中,您不使用逗号分隔列表中的元素。相反,你只需使用空格。告诉我这是不是错了,但我想的是你试图匹配像(define s '(hi there))这样的表达式。为此,您将使用

(match s
  [`(,h ,t) ...])

然后,在elipses所在的区域,变量h的值为'hi,变量t的值为'there