2013-05-09 21 views
2

我是一個計劃初學者和方案模式檢查,如果它是一個數

我想知道如何解釋這段計劃代碼?看起來很特別!

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

我知道匹配給出了一個模式,但是如何解釋這個奇怪的模式呢?

(? number? x) 

謝謝!

回答

1

(? expr pat ...)模式是match宏的語法的一部分。它將expr應用於模式並檢查結果是否爲真值。在這種情況下,這意味着它將檢查(number? x)是否返回true,其中xexp。如果是這樣,該函數將返回您傳遞給它的任何內容,如exp。否則,會引發比賽異常。

換句話說,calc2只是引發傳遞給它的任何非數字的異常,否則返回它的參數。有關模式匹配的球拍是如何工作的詳細信息,在此檢查出http://docs.racket-lang.org/reference/match.html

+0

謝謝,麥克斯韋!我只是想知道爲什麼它不是(match exp [(number?exp)exp]),x如何分配exp的值?順便說一下,這真的很難谷歌這種問題 – 2013-05-09 08:06:34

+0

在這種情況下,這意味着它會檢查是否(number?x)返回true。這是不正確的,x不能檢查,如果它的數字或不是因爲有任何值綁定x變量 – Ankur 2013-05-09 10:35:15

+0

@Ankur謝謝,回答更新! – 2013-05-10 00:09:16

1

(? number? x)當模式匹配的模式檢測?作爲第一項,然後它和是在?畢竟謂詞。所以在這種情況下,這意味着你的exp應該是一個數字,然後,因爲x不是一個謂詞,它只是意味着x與exp相同。

從文檔:

(?EXPR拍拍...) - 適用expr來要匹配的值,並檢查 結果是否真值;另外拍的還必須與 相符;即,?將謂詞應用程序和和模式組合在一起。 但是,?不同於,並且保證在任何 拍子之前expr匹配。

例子:

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

謝謝,你會舉一個關於(?expr pat)的例子,但是expr不是數字這樣的謂詞嗎? – 2013-05-09 14:45:13

+0

增加了一個例子,exp必須是一個函數,當應用於值應該返回true或false – Ankur 2013-05-10 04:01:22

相關問題