4

我是一个计划初学者和

我想知道如何解释这段方案代码?看起来很前卫!

(define (calc2 exp)
   (match exp                                
     [(? number? x)  x]))

我知道 match 给出了一个模式,但是如何解释这个奇怪的模式呢?

 (? number? x) 

谢谢!

4

2 回答 2

1

(? number? x)在这种情况下,当模式匹配检测到 a?作为模式中的第一项时,它就是 . 之后的所有谓词?。所以在这种情况下,这意味着你exp应该是一个数字,然后因为 x 不是谓词,它只是意味着将 x 设置为相同exp

从文档中:

(? expr pat ...) — 将 expr 应用于要匹配的值,并检查结果是否为真值;额外的拍子也必须匹配;IE, ?结合了一个谓词应用程序和一个 and 模式。然而,? 与 and 不同,它保证 expr 在任何 pats 之前匹配。

例子:

> (match '(1 3 5)
   [(list (? odd?) ...) 'yes])
'yes
于 2013-05-09T10:34:24.743 回答
1

模式(? expr pat ...)match宏语法的一部分。它适用expr于模式并检查结果是否为真值。在这种情况下,这意味着它将检查是否(number? x)返回 true,where xis exp. 如果是这样,该函数将返回您传递给它的任何内容作为exp. 如果不是,它将引发匹配异常。

换句话说, calc2 只是为传递给它的任何非数字值引发异常,否则返回它的参数。有关模式匹配如何在 Racket 中工作的更多信息,请查看http://docs.racket-lang.org/reference/match.html

于 2013-05-09T07:52:37.750 回答