Racket 中的模式匹配
简单来说,模式匹配就是以确定的结构去「匹配」原数据,将原数据结构化(将原数据拆分成各个元素,并命名之),也就得到了对原数据的操作能力
用法呢,要比正则表达式简单多了
可查看 Pattern Matching | Racket Documentation
例如我们要将 '(1 2 3)
其中的元素倒过来,可以这么做:
(match '(1 2 3)
[(list a b c) (list c b a)])
; => '(3 2 1)
如果要将其中的元素相加呢?
(match '(1 2 3)
[(list a b c) (+ a b c)])
; => 6
一些例子
如果 0 到 100 闭区间内的数能被 3 整除,则输出该数并标记 *
, 如果能被 5 整除,则输出该数并标记 #
, 如果既能被 3 整除又能被 5 整除,则输出该数并标记 *#
#lang racket
(require math/number-theory)
(define (range-closed start end)
(range start (+ end 1)))
(for-each (lambda (x)
(match `(3 ,(divides? 3 x) and 5 ,(divides? 5 x))
['(3 #t and 5 #f) (printf "~A*~n" x)]
['(3 #f and 5 #t) (printf "~A#~n" x)]
['(3 #t and 5 #t) (printf "~A*#~n" x)]
[else '()]))
(range-closed 0 100))
过程简洁明了