Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Extensible Pattern Matching
Search
Sam Tobin-Hochstadt
September 26, 2011
Programming
74
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Extensible Pattern Matching
A talk at IFL 2010 in Alphen an der Rijn, the Netherlands
Sam Tobin-Hochstadt
September 26, 2011
More Decks by Sam Tobin-Hochstadt
See All by Sam Tobin-Hochstadt
Evolving Existing Languages: The Typed Racket Experience
samth
1
140
Logical Types for Untyped Languages
samth
1
270
Semantic Solutions to Program Analysis Problems
samth
1
86
Other Decks in Programming
See All in Programming
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
160
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
180
Cloudflare is Agents
chimame
0
180
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.9k
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
190
typoなんかねぇよ
raspython3
0
600
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
160
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
540
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
510
Deep dive into the select statement (GopherCon UK)
jespino
0
150
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
240
不幸な GC
chencmd
0
800
Featured
See All Featured
AI: The stuff that nobody shows you
jnunemaker
PRO
9
940
エンジニアに許された特別な時間の終わり
watany
108
250k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
490
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
350
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
510
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Faster Mobile Websites
deanohume
310
32k
Transcript
Extensible Pattern Matching Sam Tobin-Hochstadt PLT @ Northeastern University IFL,
September 3, 2010
Extensible Pattern Matching in an Extensible Language Sam Tobin-Hochstadt PLT
@ Northeastern University IFL, September 3, 2010
(: magnitude : Complex -> Real) (define (magnitude n) (cond
[(eq? (first n) 'cart) (sqrt (+ (sqr (second n)) (sqr (third n))))] [(eq? (first n) 'polar) (second n)]))
(: magnitude : Complex -> Real) (define (magnitude n) (if
(not (pair? n)) (error 'bad-input) (let ([t1 (first n)] [t1* (rest n)]) (if (not (pair? t1*)) (error 'bad-input) (let ([t2 (first t1*)] [t2* (rest t1*)]) (if (not (pair? t3)) (error 'bad-input) (let ([t3 (first t2*)] [t3* (rest t2*)]) (if (not (null? t3)) (error 'bad-input)) (cond [(eq? t1 'cart) (sqrt (+ (sqr t2) (sqr t3)))] [(eq? t1 'polar) t2] [else (error 'bad-input)]))))))) )
(: magnitude : Complex -> Real) (define (magnitude n) (match
n [(list 'cart x y) (sqrt (+ (sqr x) (sqr y)))] [(list 'polar r theta) r]))
(: magnitude : Complex -> Real) (define (magnitude n) (match
n [(list 'cart xs ...) (sqrt (apply + (map sqr xs)))] [(list 'polar r theta ...) r]))
(: magnitude : Complex -> Real) (define (magnitude n) (match
n [(cart xs ...) (sqrt (apply + (map sqr xs)))] [(polar r theta ...) r]))
(: magnitude : Complex -> Real) (define (magnitude n) (match
n [(polar r theta ...) r]))
Pattern Matching in Racket
match works for arbitrary data (match e [(list a b)
(+ a b)] [(? string? a) (string-length a)] [(? number? a) a])
match provides expressive patterns (match e [(app add1 n) n])
match is an optimizer (match e [(list (? B?)) do-something-else])
[Le Fessant & Maranget]
match supports recursive patterns (match (list 2 4 6 8
10) [(list (? even? y) ...) (foldr + 0 y)])
match supports recursive patterns (match '(3 2 1 3) [(list-no-order
1 2 3 ...) 'yes] [_ 'no])
Extensible Languages
Simple Language Extension (define-syntax (let ([x e] ...) body) ((lambda
(x ...) body) e ...)) (let ([x 1] [y 2]) (+ x y))
Simple Language Extension (define-syntax (let ([x e] ...) body) ((lambda
(x ...) body) e ...)) (let ([x 1] [y 2]) (+ x y)) ((lambda (x y) (+ x y)) 1 2)
Simple Language Extension (define-syntax (let ([x e] ...) body) ((lambda
(x ...) body) e ...)) (let ([x 1] [y 2]) (+ x y)) ((lambda (x y) (+ x y)) 1 2) [Kohlbecker et al, 1980s]
Adding Computation (define-syntax (numbers start end) (list (in-range start end)))
(numbers 1 10)
Adding Computation (define-syntax (numbers start end) (list (in-range start end)))
(numbers 1 10) (list 1 2 3 4 5 6 7 8 9 10)
Adding Computation (define-syntax (numbers start end) (list (in-range start end)))
(numbers 1 10) (list 1 2 3 4 5 6 7 8 9 10) [Dybvig et al, 1990s]
Racket Modular Language Extension Compiler API Arbitrary Language Rewriting ...
Racket Modular Language Extension Compiler API Arbitrary Language Rewriting ...
[Flatt et al, 2000s]
(define-syntax x 1) (define-syntax (get-x) (syntax-value x)) (get-x)
(define-syntax x 1) (define-syntax (get-x) (syntax-value x)) (get-x) 1
Extensible Pattern Matching
(define-syntax (let ([x e] ...) b) ((lambda (x ...) b)
e ...))
(define-syntax (let ([x e] ...) b) ((lambda (x ...) b)
e ...)) (define-matcher (not-false p) (? (compose not false?) p))
The core of match (define (parse-pattern pat) (syntax-case pat [(cons
pat1 pat2) ...] [(? pred pat) ...] ...))
The extended core (define (parse-pattern pat) (syntax-case pat [(id pats
...) ] [(cons pat1 pat2) ...] [(? pred pat) ...] ...))
The extended core (define (parse-pattern pat) (syntax-case pat [(id pats
...) #:when (bound-to-match-expander? id) ] [(cons pat1 pat2) ...] [(? pred pat) ...] ...))
The extended core (define (parse-pattern pat) (syntax-case pat [(id pats
...) #:when (bound-to-match-expander? id) (syntax-value id) ] [(cons pat1 pat2) ...] [(? pred pat) ...] ...))
The extended core (define (parse-pattern pat) (syntax-case pat [(id pats
...) #:when (bound-to-match-expander? id) (match-expander-fn (syntax-value id)) ] [(cons pat1 pat2) ...] [(? pred pat) ...] ...))
The extended core (define (parse-pattern pat) (syntax-case pat [(id pats
...) #:when (bound-to-match-expander? id) (let ([transformer (match-expander-fn (syntax-value id))]) )] [(cons pat1 pat2) ...] [(? pred pat) ...] ...))
The extended core (define (parse-pattern pat) (syntax-case pat [(id pats
...) #:when (bound-to-match-expander? id) (let ([transformer (match-expander-fn (syntax-value id))]) (transformer (id pats ...)) )] [(cons pat1 pat2) ...] [(? pred pat) ...] ...))
The extended core (define (parse-pattern pat) (syntax-case pat [(id pats
...) #:when (bound-to-match-expander? id) (let ([transformer (match-expander-fn (syntax-value id))]) (parse-pattern (transformer (id pats ...))))] [(cons pat1 pat2) ...] [(? pred pat) ...] ...))
An Example (define-matcher (not-false p) ...) (match (list 7 #f)
[(list (not-false x) ... y) x])
An Example (define-syntax not-false (match-expander ...)) (match (list 7 #f)
[(list (not-false x) ... y) x])
An Example (define-syntax not-false (match-expander ...)) (match (list 7 #f)
[(list (not-false z) ... y) z]) (let ([transformer (match-expander-fn (syntax-value not-false))]) (parse-pattern (transformer (not-false z))))
An Example (define-syntax not-false (match-expander ...)) (match (list 7 #f)
[(list (not-false z) ... y) z]) (? (compose not false?) z)
An Example (define-syntax not-false (match-expander ...)) (match (list 7 #f)
[(list (? (compose not false?) z) ... y) z])
Applications
Views [Wadler 87] as a library (require (planet cobbe/views/views)) (define-view
Zero zero? ()) (define-view Succ exact-positive-integer? (sub1)) (define (even? n) (match n [(Zero) true] [(Succ (Zero)) false] [(Succ (Succ n)) (even? n)]))
Web Server Dispatching (dispatch-rules [("") list-posts] [("posts" (string-arg)) review-post] [("archive"
(integer-arg) (integer-arg)) review-archive] [else list-posts])
Other Extensible Systems View Patterns [Peyton-Jones et al]: app patterns
Views [Wadler]: define-matcher and app Active Patterns [Syme et al]: Multiple uses of define-matcher, app, and ?
Pattern matching is great Extensible pattern matching is even better
An expressive and extensible language can give us both
Thanks! Available at racket-lang.org