GH-196 pattern matching lhs (#210)

* Allow block with separate type signature and definition of a function

For instance,
```
function
  add : (int, int) => int
  add(x, y) = x + y
```

cc #196

* Allow pattern matching in left-hand sides

* Changelog

* Fix type spec

* partial case-on-constructor

* Changelog for pattern-matching lets
This commit is contained in:
Ulf Norell
2020-01-15 09:41:03 +01:00
committed by GitHub
parent f7abaf07fa
commit 4d4a14a9ab
15 changed files with 315 additions and 147 deletions
+4 -4
View File
@@ -11,7 +11,7 @@ contract Factorial =
stateful entrypoint set_worker(worker) = put(state{worker = worker})
entrypoint fac(x : int) : int =
if(x == 0) 1
else x * state.worker.fac(x - 1)
entrypoint
fac : int => int
fac(0) = 1
fac(x) = x * state.worker.fac(x - 1)
+22
View File
@@ -0,0 +1,22 @@
contract LHSMatching =
function from_some(Some(x)) = x
function
length : list('a) => int
length([]) = 0
length(_ :: xs) = 1 + length(xs)
function
append([], ys) = ys
append(x :: xs, ys) = x :: append(xs, ys)
function local_match(xs : list('a)) =
let null([]) = true
let null(_ :: _) = false
!null(xs)
entrypoint main() =
from_some(Some([0]))
++ append([length([true]), 2, 3], [4, 5, 6])
++ [7 | if (local_match([false]))]
+3 -4
View File
@@ -8,10 +8,9 @@ contract Stack =
entrypoint init(ss : list(string)) = { stack = ss, size = length(ss) }
function length(xs) =
switch(xs)
[] => 0
_ :: xs => length(xs) + 1
function
length([]) = 0
length(_ :: xs) = length(xs) + 1
stateful entrypoint pop() : string =
switch(state.stack)