aboutsummaryrefslogtreecommitdiff
path: root/lessons/src
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2023-12-12 15:29:01 +0000
committerLouis Pilfold <louis@lpil.uk>2023-12-12 15:29:05 +0000
commitb0840f22e53f6a820b11ba538fb3a9b926fb9b29 (patch)
tree055996a034409f7e401cdd853ba5895eb93add84 /lessons/src
parent819cc743eba34cdd25e25f3c6ba5891a8cb6077d (diff)
downloadtour-b0840f22e53f6a820b11ba538fb3a9b926fb9b29.tar.gz
tour-b0840f22e53f6a820b11ba538fb3a9b926fb9b29.zip
More lessons
Diffstat (limited to 'lessons/src')
-rw-r--r--lessons/src/lesson022_case_expressions/code.gleam10
-rw-r--r--lessons/src/lesson022_case_expressions/text.html7
-rw-r--r--lessons/src/lesson023_variable_patterns/code.gleam16
-rw-r--r--lessons/src/lesson023_variable_patterns/text.html17
-rw-r--r--lessons/src/lesson024_string_patterns/code.gleam14
-rw-r--r--lessons/src/lesson024_string_patterns/text.html9
-rw-r--r--lessons/src/lesson025_list_patterns/code.gleam17
-rw-r--r--lessons/src/lesson025_list_patterns/text.html15
-rw-r--r--lessons/src/lesson026_list_recursion/code.gleam13
-rw-r--r--lessons/src/lesson026_list_recursion/text.html22
10 files changed, 140 insertions, 0 deletions
diff --git a/lessons/src/lesson022_case_expressions/code.gleam b/lessons/src/lesson022_case_expressions/code.gleam
new file mode 100644
index 0000000..33c0290
--- /dev/null
+++ b/lessons/src/lesson022_case_expressions/code.gleam
@@ -0,0 +1,10 @@
+import gleam/io
+import gleam/int
+
+pub fn main() {
+ let result = case int.random(0, 5) {
+ 0 -> "It's zero!"
+ other -> "It's " <> int.to_string(other)
+ }
+ io.debug(result)
+}
diff --git a/lessons/src/lesson022_case_expressions/text.html b/lessons/src/lesson022_case_expressions/text.html
new file mode 100644
index 0000000..7e9ac11
--- /dev/null
+++ b/lessons/src/lesson022_case_expressions/text.html
@@ -0,0 +1,7 @@
+<p>
+ Patterns in case expressions can also assign variables.
+</p>
+<p>
+ When a variable name is used in a pattern the value that is matched against is
+ assigned to that name, and can be used in the body of that clause.
+</p>
diff --git a/lessons/src/lesson023_variable_patterns/code.gleam b/lessons/src/lesson023_variable_patterns/code.gleam
new file mode 100644
index 0000000..78eb050
--- /dev/null
+++ b/lessons/src/lesson023_variable_patterns/code.gleam
@@ -0,0 +1,16 @@
+import gleam/io
+import gleam/int
+
+pub fn main() {
+ let x = int.random(0, 5)
+ io.debug(x)
+
+ let result = case x {
+ // Match specific values
+ 0 -> "Zero"
+ 1 -> "One"
+ // Match any other value
+ _ -> "Other"
+ }
+ io.debug(result)
+}
diff --git a/lessons/src/lesson023_variable_patterns/text.html b/lessons/src/lesson023_variable_patterns/text.html
new file mode 100644
index 0000000..8154979
--- /dev/null
+++ b/lessons/src/lesson023_variable_patterns/text.html
@@ -0,0 +1,17 @@
+<p>
+ The case expression is the most common kind of flow control in Gleam code. It
+ is similar to `switch` in some other languages, but more powerful than most.
+</p>
+<p>
+ It allows the programmer to say "if the data has this shape then run this
+ code", a process called called <em>pattern matching</em>.
+</p>
+<p>
+ Gleam performs <em>exhaustiveness checking</em> to ensure that the patterns in
+ a case expression cover all possible values. With this you can have confidence
+ that your logic is up-to-date for the design of the data you are working with.
+</p>
+<p>
+ Try commenting out patterns or adding new redundant ones, and see what
+ problems the compiler reports.
+</p>
diff --git a/lessons/src/lesson024_string_patterns/code.gleam b/lessons/src/lesson024_string_patterns/code.gleam
new file mode 100644
index 0000000..d1441a0
--- /dev/null
+++ b/lessons/src/lesson024_string_patterns/code.gleam
@@ -0,0 +1,14 @@
+import gleam/io
+
+pub fn main() {
+ io.debug(get_name("Hello, Joe"))
+ io.debug(get_name("Hello, Mike"))
+ io.debug(get_name("System still working?"))
+}
+
+fn get_name(x: String) -> String {
+ case x {
+ "Hello, " <> name -> name
+ _ -> "Unknown"
+ }
+}
diff --git a/lessons/src/lesson024_string_patterns/text.html b/lessons/src/lesson024_string_patterns/text.html
new file mode 100644
index 0000000..0dd3274
--- /dev/null
+++ b/lessons/src/lesson024_string_patterns/text.html
@@ -0,0 +1,9 @@
+<p>
+ When pattern matching on strings the <code>&lt;&gt;</code> operator can be
+ used to match on strings with a specific prefix.
+</p>
+<p>
+ The pattern <code>"hello " <> name</code> matches any string that starts with
+ <code>"hello "</code> and asigns the rest of the string to the variable
+ <code>name</code>.
+</p>
diff --git a/lessons/src/lesson025_list_patterns/code.gleam b/lessons/src/lesson025_list_patterns/code.gleam
new file mode 100644
index 0000000..a5619aa
--- /dev/null
+++ b/lessons/src/lesson025_list_patterns/code.gleam
@@ -0,0 +1,17 @@
+import gleam/io
+import gleam/int
+import gleam/list
+
+pub fn main() {
+ let x = list.repeat(int.random(0, 5), times: int.random(0, 3))
+ io.debug(x)
+
+ let result = case x {
+ [] -> "Empty list"
+ [1] -> "List of just 1"
+ [4, ..] -> "List starting with 4"
+ [_, _] -> "List of 2 elements"
+ _ -> "Some other list"
+ }
+ io.debug(result)
+}
diff --git a/lessons/src/lesson025_list_patterns/text.html b/lessons/src/lesson025_list_patterns/text.html
new file mode 100644
index 0000000..de55eef
--- /dev/null
+++ b/lessons/src/lesson025_list_patterns/text.html
@@ -0,0 +1,15 @@
+<p>
+ Lists and the values they contain can be pattern matched on in case
+ expressions.
+</p>
+<p>
+ List patterns match on specific lengths of lists. The pattern <code>[]</code>
+ matches an empty list, and the pattern <code>[_]</code> matches a list with
+ one element. They will not match on lists with other lengths.
+</p>
+<p>
+ The spread pattern <code>..</code> can be used to match the rest of the list.
+ The pattern <code>[1, ..]</code> matches any list that starts with
+ <code>1</code>. The pattern <code>[_, _, ..]</code> matches any list that has
+ at least two elements.
+</p>
diff --git a/lessons/src/lesson026_list_recursion/code.gleam b/lessons/src/lesson026_list_recursion/code.gleam
new file mode 100644
index 0000000..370675a
--- /dev/null
+++ b/lessons/src/lesson026_list_recursion/code.gleam
@@ -0,0 +1,13 @@
+import gleam/io
+
+pub fn main() {
+ let sum = sum_list([18, 56, 35, 85, 91], 0)
+ io.debug(sum)
+}
+
+fn sum_list(list: List(Int), total: Int) -> Int {
+ case list {
+ [first, ..rest] -> sum_list(rest, total + first)
+ [] -> total
+ }
+}
diff --git a/lessons/src/lesson026_list_recursion/text.html b/lessons/src/lesson026_list_recursion/text.html
new file mode 100644
index 0000000..7f2351d
--- /dev/null
+++ b/lessons/src/lesson026_list_recursion/text.html
@@ -0,0 +1,22 @@
+<p>
+ Most commonly functions in the
+ <a href="https://hexdocs.pm/gleam_stdlib/gleam/list.html"><code>gleam/list</code></a>
+ module are used to iterate across a list, but at times you may prefer
+ to work with the list directly.
+</p>
+<p>
+ Gleam doesn't have a looping syntax, instead iteration is done through
+ recursion and pattern matching.
+</p>
+<p>
+ The <code>[first, ..rest]</code> pattern matches on a list with at least one
+ element, assigning the first element to the variable <code>first</code> and
+ the rest of the list to the variable <code>rest</code>.
+ By using this pattern and a pattern for the empty list <code>[]</code> a
+ function can run code on each element of a list until the end is reached.
+</p>
+<p>
+ This code sums a list by recursing over the list and adding each int to a
+ <code>total</code> argument, returning it when the end is reached.
+</p>
+