的racket/match
庫包括可通過?
圖案使用任意的謂詞模式匹配。隨着and
,你應該能夠得到球拍的匹配表現。雖然我有點弱,我OCaml中,我覺得上面的代碼下面翻譯匹配它的含義:
(define (my-read #:var-a var-a var-b s)
(match (string-ref s 0)
[(and _
(? (lambda (_)
(>= var-b (+ var-a 4)))))
"do something"]
[(and '#\a
(? (lambda (_)
(< var-b 0))))
"do something else"]))
;; Exercising the first case:
(my-read #:var-a 50
60 "blah")
;; Exercising the second case:
(my-read #:var-a 50
-40 "alphabet")
的?
匹配嵌入了,所以代碼可以表示稍隱式and
簡潔爲:
(define (my-read #:var-a var-a var-b s)
(match (string-ref s 0)
[(? (lambda (_)
(>= var-b (+ var-a 4))))
"do something"]
[(? (lambda (_)
(< var-b 0))
#\a)
"do something else"]))
在這兩個,在那裏lambda表達式不是在看什麼得到了匹配,所以我只是將它們命名爲_
來表示不關心。但是你可以想象更復雜的模式,謂詞可以深入地關注匹配的內容。
禮建議使用一般的cond
這裏,因爲沒有代碼匹配任何顯著模式。我同意。代碼如下所示:
(define (my-read #:var-a var-a var-b s)
(cond
[(>= var-b (+ var-a 4))
"do something"]
[(and (char=? (string-ref s 0) #\a)
(< var-b 0))
"do something else"]))
使用這麼多'?'表明,它想表達一個普通的更好'cond' ... – 2012-02-12 23:41:34