git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #61 from chrissmoak/guards-scope
136cd21Phil Freeman
examples/failing/PatternScope.psnew file+7
@@ -0,0 +1,7 @@
1+-- Pattern scope doesn't leak
2+foobar = \x -> do
3+ var y = case x of
4+ z | z % 2 == 0 -> 1
5+ _ -> 2
6+ return z
7+
examples/passing/Guards.ps+5
@@ -1,3 +1,8 @@
1collatz = \x -> case x of
1collatz = \x -> case x of
2 y | y % 2 == 0 -> y / 2
2 y | y % 2 == 0 -> y / 2
3 y -> y * 3 + 1
3 y -> y * 3 + 1
4+
5+-- Guards have access to current scope
6+collatz2 = \x, y -> case x of
7+ z | y > 0 -> z / 2
8+ z -> z * 3 + 1
src/Language/PureScript/TypeChecker/Types.hs+8−5
@@ -436,10 +436,13 @@ typeConstraintsForBinder val b@(NamedBinder name binder) = do
436 me <- fresh
436 me <- fresh
437 (cs, m) <- typeConstraintsForBinder val binder
437 (cs, m) <- typeConstraintsForBinder val binder
438 return (TypeConstraint me (TUnknown val) (BinderOrigin b) : cs, M.insert name me m)
438 return (TypeConstraint me (TUnknown val) (BinderOrigin b) : cs, M.insert name me m)
439+
440+typeConstraintsForGuardedBinder :: M.Map Ident Int -> Int -> Binder -> Check ([TypeConstraint], M.Map Ident Int)
439−typeConstraintsForBinder val b@(GuardedBinder cond binder) = do
441+typeConstraintsForGuardedBinder m val b@(GuardedBinder cond binder) = do
440− (cs1, m) <- typeConstraintsForBinder val binder
442+ (cs1, m1) <- typeConstraintsForBinder val binder
441− (cs2, n) <- typeConstraints m cond
443+ (cs2, n) <- typeConstraints (m `M.union` m1) cond
442− return (TypeConstraint n Boolean (ValueOrigin cond) : cs1 ++ cs2, m)
444+ return (TypeConstraint n Boolean (ValueOrigin cond) : cs1 ++ cs2, m1)
445+typeConstraintsForGuardedBinder m val b = typeConstraintsForBinder val b >>= return
443
446
444constantBinder :: Binder -> Int -> Type -> Check ([TypeConstraint], M.Map Ident Int)
447constantBinder :: Binder -> Int -> Type -> Check ([TypeConstraint], M.Map Ident Int)
445constantBinder b val ty = return ([TypeConstraint val ty (BinderOrigin b)], M.empty)
448constantBinder b val ty = return ([TypeConstraint val ty (BinderOrigin b)], M.empty)
@@ -447,7 +450,7 @@ constantBinder b val ty = return ([TypeConstraint val ty (BinderOrigin b)], M.em
447typeConstraintsForBinders :: M.Map Ident Int -> Int -> Int -> [(Binder, Value)] -> Check [TypeConstraint]
450typeConstraintsForBinders :: M.Map Ident Int -> Int -> Int -> [(Binder, Value)] -> Check [TypeConstraint]
448typeConstraintsForBinders _ _ _ [] = return []
451typeConstraintsForBinders _ _ _ [] = return []
449typeConstraintsForBinders m nval ret ((binder, val):bs) = do
452typeConstraintsForBinders m nval ret ((binder, val):bs) = do
450− (cs1, m1) <- typeConstraintsForBinder nval binder
453+ (cs1, m1) <- typeConstraintsForGuardedBinder m nval binder
451 (cs2, n2) <- typeConstraints (m `M.union` m1) val
454 (cs2, n2) <- typeConstraints (m `M.union` m1) val
452 cs3 <- typeConstraintsForBinders m nval ret bs
455 cs3 <- typeConstraintsForBinders m nval ret bs
453 return (TypeConstraint n2 (TUnknown ret) (BinderOrigin binder) : cs1 ++ cs2 ++ cs3)
456 return (TypeConstraint n2 (TUnknown ret) (BinderOrigin binder) : cs1 ++ cs2 ++ cs3)