方案模式检查它是否是一个数字

时间:2013-05-09 07:24:02

标签: functional-programming lisp scheme pattern-matching racket

我是计划初学者和

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

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

我知道匹配给出了一种模式,但如何解释这种奇怪的模式?

 (? number? x) 

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

来自文档:

  

(?expr pat ...) - 将expr应用于要匹配的值,并进行检查   结果是否真实值;额外的拍子也必须   比赛;即,?结合了谓词应用程序和模式。   然而,?和,保证expr在任何之前匹配   拍拍。

示例:

> (match '(1 3 5)
   [(list (? odd?) ...) 'yes])
'yes