From: jim
Date: Thu, 5 Feb 2015 15:07:19 +0000 (-0500)
Subject: add #guards and #as-patterns anchors
X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=commitdiff_plain;h=c8d77fee6e911a407c542aa6c4f0211b87ac20c8;hp=a2e4fe8d3a80dbf19bbd9e347620b09229d895de
add #guards and #as-patterns anchors
---
diff --git a/topics/week1_advanced_notes.mdwn b/topics/week1_advanced_notes.mdwn
index 51da5014..dd143fc6 100644
--- a/topics/week1_advanced_notes.mdwn
+++ b/topics/week1_advanced_notes.mdwn
@@ -71,6 +71,7 @@ This is one of the few places where I'll indulge in the use of single `=`. Note
This special syntax is only permitted in `let`- and `letrec`-constructions, not in `case`-constructions.
+
### Pattern guards ###
In `case` contructions, it's sometimes useful to check not only whether a certain pattern matches, but also whether a certain boolean expression is true, typically where we want some variables in that expression to be bound by the relevant pattern. Thus, for example, if we wanted to count the number of odd numbers in a sequence, we could do this:
@@ -98,6 +99,7 @@ It's a bit cumbersome, though, to have the doubly-embedded `case`-constructions.
If we get to the `y & ys` line in the pattern list, and the pattern-match succeeds, then we check the guard expression `odd? y`, with `y` bound to whatever part of `xs` matched the corresponding part of the pattern `y & ys`. If that boolean expression is `'true`, then we continue to the right-hand side, after the `then`, just as usual. But if the boolean expression is `'false`, then we treat the whole line as a failed match, and proceed on to the next line in the binding list, if any.
+
### As-patterns ###
Sometimes it's useful to bind variables against overlapping parts of a structure. For instance, suppose I'm writing a pattern that is to be matched against multivalues like `([10, 20], 'true)`. And suppose I want to end up with `ys` bound to `[10, 20]`, `x` bound to `10`, and `xs` bound to `[20]`. Using the techniques introduced so far, I have two options. First, I could bind `ys` against `[10, 20]`, and then initiate a second pattern-match to break that up into `10` and `[20]`. Like this: