我是计划初学者和
我想知道如何解释这段方案代码?看起来很奇特!
(define (calc2 exp)
(match exp
[(? number? x) x]))
我知道匹配给出了一种模式,但如何解释这种奇怪的模式?
(? number? x)
谢谢!
答案 0 :(得分:1)
模式(? expr pat ...)
是match
宏语法的一部分。它将expr
应用于模式并检查结果是否为真值。在这种情况下,这意味着它会检查(number? x)
是否返回true,x
是exp
。如果是,则该函数将返回您传递给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