Skip to content

Commit

Permalink
Improve docs and update examples with new match syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
imaqtkatt committed Feb 27, 2024
1 parent 03c6091 commit a0dbd04
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 23 deletions.
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ data List = (List.cons head tail) | (List.nil)
ListEx2 = (List.cons 1 (List.cons 2 (List.cons 3 List.nil)))
```

Match different kinds of terms, both matches are equivalent:
It's possible to match different kinds of terms. These three forms are equivalent:
```rs
match list {
(List.cons hd tl): (Some hd)
Expand Down Expand Up @@ -162,7 +162,7 @@ Which is the equivalent of nesting match terms:
```rs
match 4 {
0: "zero"
1+a: match (- a 4) {
1+a: match (- (+ a (+ 0 1)) 5) {
0: "five"
_: ...
}
Expand All @@ -171,9 +171,10 @@ match 4 {

Match multiple terms:
```rs
match True, True {
True True: True
_ _: False
λa λb match a, b {
(Some True) (x, y): (Some (x, y))
(Some False) (x, y): (Some (y, x))
None *: None
}
```

Expand Down
1 change: 1 addition & 0 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"namegen",
"nams",
"numop",
"nums",
"oper",
"opre",
"oprune",
Expand Down
8 changes: 4 additions & 4 deletions docs/compiler-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,20 +142,20 @@ When the `linearize-matches` option is used, linearizes only vars that are used

Example:
```rs
λa λb match a { 0: b; +: b }
λa λb match a { 0: b; 1+: b }

// Is transformed to
λa λb (match a { 0: λc c; +: λd d } b)
λa λb (match a { 0: λc c; 1+: λd d } b)
```

When the `linearize-matches-extra` option is used, linearizes all vars used in the arms.

example:
```rs
λa λb λc match a { 0: b; +: c }
λa λb λc match a { 0: b; 1+: c }

// Is transformed to
λa λb λc (match a { 0: λd λ* d; +: λ* λe e } b c)
λa λb λc (match a { 0: λd λ* d; 1+: λ* λe e } b c)
```

## float-combinators
Expand Down
18 changes: 7 additions & 11 deletions docs/native-numbers.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,19 @@ HVM-lang also includes a `match` syntax for native numbers. The `0` case is chos
Number.to_church = λn λf λx
match n {
0: x
+: (f (Number.to_church n-1 f x))
1+: (f (Number.to_church n-1 f x))
}
// Alternative syntax
Number.to_church = λn λf λx
match n {
0: x
+p: (f (Number.to_church p f x))
1+p: (f (Number.to_church p f x))
}
// Alternative syntax with name binding
Number.to_church = λn λf λx
match num = n {
0: x
+: (f (Number.to_church num-1 f x)
1+: (f (Number.to_church num-1 f x)
}
```

Expand All @@ -60,14 +60,10 @@ fibonacci = λn // n is the argument
match n {
// If the number is 0, then return 0
0: 0
// If the number is greater than 0, bind it predecessor to `a`
+a:
match a {
// If the predecessor is 0, then return 1
0: 1
// Otherwise, bind n-2 to `b` and return the sum of (fib n-1) and (fib n-2)
+b: (+ (fibonacci a) (fibonacci b))
}
// If the number is 1, then return 1
1: 1
// Otherwise, and return the sum of (fib (n-2 + 1)) and (fib n-2)
2+: (+ (fibonacci (+ n-2 1)) (fibonacci n-2))
}

main = (fibonacci 15)
Expand Down
2 changes: 1 addition & 1 deletion docs/writing-fusing-functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ not = λboolean (boolean false true)
fusing_not = λboolean λt λf (boolean f t)
// Creates a Church numeral out of a native number
to_church 0 = λf λx x
to_church +p = λf λx (f (to_church p f x))
to_church 1+p = λf λx (f (to_church p f x))
main =
let two = λf λx (f (f x))
let two_pow_512 = ((to_church 512) two) // Composition of church-encoded numbers is equivalent to exponentiation.
Expand Down
2 changes: 1 addition & 1 deletion examples/example.hvm
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
(Num.pred) = λn
match n {
0: 0
+: n-1
1+: n-1
}

// Write new data types like this
Expand Down
2 changes: 1 addition & 1 deletion examples/fusing_not.hvm
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ not = λboolean (boolean false true)
fusing_not = λboolean λt λf (boolean f t)
// Creates a Church numeral out of a native number
to_church 0 = λf λx x
to_church +p = λf λx (f (to_church p f x))
to_church 1+p = λf λx (f (to_church p f x))
main =
let two = λf λx (f (f x))
let two_pow_512 = ((to_church 512) two) // Composition of church-encoded numbers is equivalent to exponentiation.
Expand Down

0 comments on commit a0dbd04

Please sign in to comment.