我是一个计划初学者和
我想知道如何解释这段方案代码?看起来很前卫!
(define (calc2 exp)
(match exp
[(? number? x) x]))
我知道 match 给出了一个模式,但是如何解释这个奇怪的模式呢?
(? number? x)
谢谢!
我是一个计划初学者和
我想知道如何解释这段方案代码?看起来很前卫!
(define (calc2 exp)
(match exp
[(? number? x) x]))
我知道 match 给出了一个模式,但是如何解释这个奇怪的模式呢?
(? number? x)
谢谢!
(? number? x)
在这种情况下,当模式匹配检测到 a?
作为模式中的第一项时,它就是 . 之后的所有谓词?
。所以在这种情况下,这意味着你exp
应该是一个数字,然后因为 x 不是谓词,它只是意味着将 x 设置为相同exp
。
从文档中:
(? expr pat ...) — 将 expr 应用于要匹配的值,并检查结果是否为真值;额外的拍子也必须匹配;IE, ?结合了一个谓词应用程序和一个 and 模式。然而,? 与 and 不同,它保证 expr 在任何 pats 之前匹配。
例子:
> (match '(1 3 5)
[(list (? odd?) ...) 'yes])
'yes
模式(? expr pat ...)
是match
宏语法的一部分。它适用expr
于模式并检查结果是否为真值。在这种情况下,这意味着它将检查是否(number? x)
返回 true,where x
is exp
. 如果是这样,该函数将返回您传递给它的任何内容作为exp
. 如果不是,它将引发匹配异常。
换句话说, calc2 只是为传递给它的任何非数字值引发异常,否则返回它的参数。有关模式匹配如何在 Racket 中工作的更多信息,请查看http://docs.racket-lang.org/reference/match.html