Explicit local bindings for let/where
This commit is contained in:
@@ -165,6 +165,9 @@ definitionUnsafeBaseReason localNames allowedExternalFacts bound ast = case ast
|
||||
TStem _ -> Just "uses raw t directly"
|
||||
TFork _ _ -> Just "uses raw t directly"
|
||||
SLambda args body -> definitionUnsafeBaseReason localNames allowedExternalFacts (foldr Set.insert bound args) body
|
||||
SLet name val body ->
|
||||
definitionUnsafeBaseReason localNames allowedExternalFacts bound val
|
||||
<|> definitionUnsafeBaseReason localNames allowedExternalFacts (Set.insert name bound) body
|
||||
SEmpty -> Nothing
|
||||
SImport _ _ -> Nothing
|
||||
|
||||
@@ -187,6 +190,7 @@ astFreeRefs candidates ast = case ast of
|
||||
TStem inner -> astFreeRefs candidates inner
|
||||
TFork left right -> astFreeRefs candidates left ++ astFreeRefs candidates right
|
||||
SLambda args body -> astFreeRefs (foldr Set.delete candidates args) body
|
||||
SLet name val body -> astFreeRefs candidates val ++ astFreeRefs (Set.delete name candidates) body
|
||||
SEmpty -> []
|
||||
SImport _ _ -> []
|
||||
|
||||
@@ -584,6 +588,14 @@ lowerExprKnownAgainst expr expected = case (expr, viewExprAsType expected) of
|
||||
(SApp (SApp (SVar "err" _) value) rest, Just (VTResult errView _)) ->
|
||||
lowerUnshadowedConstructor "err" expr expected $
|
||||
lowerResultConstructor expected (viewTypeToExpr errView) value rest
|
||||
(SLet name value body, _) -> do
|
||||
(valueSym, valueNodes, _) <- lowerExprKnown value
|
||||
recordDebugName valueSym name
|
||||
bodyResult <- withLocalAlias name valueSym (lowerExprKnownAgainst body expected)
|
||||
let (bodySym, bodyNodes, bodyKnown) = bodyResult
|
||||
pure (bodySym, valueNodes ++ bodyNodes, bodyKnown)
|
||||
-- Hand-written immediately-applied lambda (not compiler output; let/where
|
||||
-- now emit SLet). Kept for source that relies on alias semantics.
|
||||
(SApp (SLambda [name] body) value, _) -> do
|
||||
(valueSym, valueNodes, _) <- lowerExprKnown value
|
||||
bodyResult <- withLocalAlias name valueSym (lowerExprKnownAgainst body expected)
|
||||
@@ -658,6 +670,14 @@ lowerExprKnown TLeaf = do
|
||||
lowerExprKnown (SList items) = do
|
||||
(sym, nodes, view, _) <- lowerListLiteral items
|
||||
pure (sym, nodes, Just view)
|
||||
lowerExprKnown (SLet name value body) = do
|
||||
(valueSym, valueNodes, _) <- lowerExprKnown value
|
||||
recordDebugName valueSym name
|
||||
bodyResult <- withLocalAlias name valueSym (lowerExprKnown body)
|
||||
let (bodySym, bodyNodes, bodyKnown) = bodyResult
|
||||
pure (bodySym, valueNodes ++ bodyNodes, bodyKnown)
|
||||
-- Hand-written immediately-applied lambda (not compiler output; let/where
|
||||
-- now emit SLet). Kept for source that relies on alias semantics.
|
||||
lowerExprKnown (SApp (SLambda [name] body) value) = do
|
||||
(valueSym, valueNodes, known) <- lowerExprKnown value
|
||||
bodyResult <- withLocalAlias name valueSym (lowerExprKnown body)
|
||||
|
||||
Reference in New Issue
Block a user