diff options
-rw-r--r-- | lessons/manifest.toml | 4 | ||||
-rw-r--r-- | lessons/src/lesson027_multiple_subjects/code.gleam | 17 | ||||
-rw-r--r-- | lessons/src/lesson027_multiple_subjects/text.html | 13 | ||||
-rw-r--r-- | lessons/src/lesson028_alternative_patterns/code.gleam | 14 | ||||
-rw-r--r-- | lessons/src/lesson028_alternative_patterns/text.html | 17 | ||||
-rw-r--r-- | lessons/src/lesson029_pattern_aliases/code.gleam | 15 | ||||
-rw-r--r-- | lessons/src/lesson029_pattern_aliases/text.html | 7 |
7 files changed, 85 insertions, 2 deletions
diff --git a/lessons/manifest.toml b/lessons/manifest.toml index 9491fa4..e1aa028 100644 --- a/lessons/manifest.toml +++ b/lessons/manifest.toml @@ -2,8 +2,8 @@ # You typically do not need to edit this file packages = [ - { name = "gleam_stdlib", version = "0.33.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "539E37A2AA5EBE8E75F4B74755E4CC604BD957C3000AC8D705A2024886A2738B" }, - { name = "gleeunit", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "D3682ED8C5F9CAE1C928F2506DE91625588CC752495988CBE0F5653A42A6F334" }, + { name = "gleam_stdlib", version = "0.34.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "1FB8454D2991E9B4C0C804544D8A9AD0F6184725E20D63C3155F0AEB4230B016" }, + { name = "gleeunit", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "D364C87AFEB26BDB4FB8A5ABDE67D635DC9FA52D6AB68416044C35B096C6882D" }, ] [requirements] diff --git a/lessons/src/lesson027_multiple_subjects/code.gleam b/lessons/src/lesson027_multiple_subjects/code.gleam new file mode 100644 index 0000000..d7aa34a --- /dev/null +++ b/lessons/src/lesson027_multiple_subjects/code.gleam @@ -0,0 +1,17 @@ +import gleam/io +import gleam/int + +pub fn main() { + let x = int.random(2) + let y = int.random(2) + io.debug(x) + io.debug(y) + + let result = case x, y { + 0, 0 -> "Both are zero" + 0, _ -> "First is zero" + _, 0 -> "Second is zero" + _, _ -> "Neither are zero" + } + io.debug(result) +} diff --git a/lessons/src/lesson027_multiple_subjects/text.html b/lessons/src/lesson027_multiple_subjects/text.html new file mode 100644 index 0000000..26a7ea3 --- /dev/null +++ b/lessons/src/lesson027_multiple_subjects/text.html @@ -0,0 +1,13 @@ +<p> + Sometimes it is useful to pattern match on multiple values at the same time in + one case experession. +</p> +<p> + To do this you can give multiple subjects and multiple patterns, separated + commas. +</p> +<p> + When matching on multiple subjects there must be the same number of patterns + as there are subjects. Try removing one of the <code>_,</code> sub-patterns to + see the compile time error that is returned. +</p> diff --git a/lessons/src/lesson028_alternative_patterns/code.gleam b/lessons/src/lesson028_alternative_patterns/code.gleam new file mode 100644 index 0000000..06a6562 --- /dev/null +++ b/lessons/src/lesson028_alternative_patterns/code.gleam @@ -0,0 +1,14 @@ +import gleam/io +import gleam/int + +pub fn main() { + let number = int.random(10) + io.debug(number) + + let result = case number { + 2 | 4 | 6 | 8 -> "This is an even number" + 1 | 3 | 5 | 7 -> "This is an odd number" + _ -> "I'm not sure" + } + io.debug(result) +} diff --git a/lessons/src/lesson028_alternative_patterns/text.html b/lessons/src/lesson028_alternative_patterns/text.html new file mode 100644 index 0000000..10ad731 --- /dev/null +++ b/lessons/src/lesson028_alternative_patterns/text.html @@ -0,0 +1,17 @@ +<p> + Alternative patterns can be given for a case clause using the + <code>|</code> operator. If any of the patterns match then the clause matches. +</p> +<p> + When matching on multiple subjects there must be the same number of patterns + as there are subjects. Try removing one of the <code>_,</code> sub-patterns to + see the compile time error that is returned. +</p> +<p> + If a pattern defines a variable then all of the alternative patterns for that + clause must also define a variable with the same name and same type. +</p> +<p> + Currently it is not possible to have nested alternative patterns, so the + pattern <code>[1 | 2 | 3]</code> is not valid. +</p> diff --git a/lessons/src/lesson029_pattern_aliases/code.gleam b/lessons/src/lesson029_pattern_aliases/code.gleam new file mode 100644 index 0000000..ee40a26 --- /dev/null +++ b/lessons/src/lesson029_pattern_aliases/code.gleam @@ -0,0 +1,15 @@ +import gleam/io + +pub fn main() { + io.debug(get_first_non_empty([[], [1, 2, 3], [4, 5]])) + io.debug(get_first_non_empty([[1, 2], [3, 4, 5], []])) + io.debug(get_first_non_empty([[], [], []])) +} + +fn get_first_non_empty(lists: List(List(t))) -> List(t) { + case lists { + [[_, ..] as first, ..] -> first + [_, ..rest] -> get_first_non_empty(rest) + [] -> [] + } +} diff --git a/lessons/src/lesson029_pattern_aliases/text.html b/lessons/src/lesson029_pattern_aliases/text.html new file mode 100644 index 0000000..5aa8a81 --- /dev/null +++ b/lessons/src/lesson029_pattern_aliases/text.html @@ -0,0 +1,7 @@ +<p> + The <code>as</code> operator can be used to assign sub patterns to variables. +</p> +<p> + For example, the pattern <code>[_, ..] as it</code> will match any non-empty + list and assign that list to the variable <code>it</code>. +</p> |