Match
Pattern matching lets you take apart structures into their component variables in a simple way.
You can use (require racket/match)
to activate pattern matching.
Matching
The match
function is like cond
except it checks to see if a value
matches a certain “literal” pattern or question. It can create
variables to use immediately instead of requiring a helper function.
Problem
Write a function that takes in a number or a posn and returns the distance to the correct origin (either 0 or (0,0)) depending on which type it gets.
Example Solution: Cond
(define (cond-to-zero w)
(cond [(posn? w) (sqrt (+ (sqr (posn-x w))
(sqr (posn-y w))))]
[(number? w) (abs w)]))
Example Solution: Match
(define (match-to-zero w)
(match n
[(posn x y) (sqrt (+ (sqr x)
(sqr y)))]
[number? (abs w)]))
Ignoring parts of a model
You can use the underscore _
to match places that you want to
ignore. This example shows how to pull out two scores from a model and
use them to find the total number of points in the game.
(define-struct game (p1pos p1score p2pos p2score))
(define (total-score model)
(match model
[(game _ s1 _ s2)
(+ s1 s2)]
List processing with matching
Suppose you want to add all of the numbers in a list. You can use the
'()
pattern to match the empty list. The pattern (list a more ...)
makes a
match the first of the list and more
match the rest of the list.
(define (add-all data)
(match data
['()
0]
[(list a more ...)
(+ a (add-add more))]))