Copyright | (c) Kimiyuki Onaka 2021 |
---|---|
License | Apache License 2.0 |
Maintainer | kimiyuki95@gmail.com |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
Synopsis
- run :: (MonadAlpha m, MonadError Error m) => Program -> m Program
- runForStatement :: (MonadState Env m, MonadAlpha m, MonadError Error m) => Target' -> Expr' -> [Statement] -> [Statement] -> [[Statement]] -> m Expr
- runIfStatement :: (MonadState Env m, MonadAlpha m, MonadError Error m) => Expr' -> [Statement] -> [Statement] -> [Statement] -> [[Statement]] -> m Expr
Documentation
run :: (MonadAlpha m, MonadError Error m) => Program -> m Program Source #
run
converts programs of our restricted Python-like language to programs of our core language.
This assumes the follwing conditions:
doesntHaveSubscriptionInLoopCounters
doesntHaveLeakOfLoopCounters
doesntHaveAssignmentToLoopCounters
doesntHaveAssignmentToLoopIterators
doesntHaveReturnInLoops
doesntHaveNonTrivialSubscriptedAssignmentInForLoops
For example, this converts the following:
def solve(n): if n == 0: return 1 else: return n * solve(n - 1)
to:
let solve n = if n == 0 then 1 else: n * solve (n - 1) in solve
Also, this converts the following:
def solve(n): a = 0 b = 1 for _ in range(n): c = a + b a = b b = c return a
to:
let solve n = fst (foldl (fun (a, b) i -> (b, a + b)) (0, 1) [0 .. n - 1]) in solve
runForStatement :: (MonadState Env m, MonadAlpha m, MonadError Error m) => Target' -> Expr' -> [Statement] -> [Statement] -> [[Statement]] -> m Expr Source #
runForStatement
converts for-loops to foldl
.
For example, this converts the following:
# a, b are defined for _ in range(n): c = a + b a = b b = c ...
to:
let (a, b) = foldl (fun (a, b) i -> (b, a + b)) (a, b) (range n) in ...
runIfStatement :: (MonadState Env m, MonadAlpha m, MonadError Error m) => Expr' -> [Statement] -> [Statement] -> [Statement] -> [[Statement]] -> m Expr Source #
runIfStatement
converts if-loops to if-exprs.
# a, b are defined if True: a = 0 b = 1 c = 3 else: a = 1 c = 10 ...
to:
let (a, c) = if true then (0, 3) else (1, 10) in ...