packages feed

Feval-1.0.0.0: examples.hs

import FVL.FAST
import FVL.Algebra
import qualified FVL.F as F
import qualified FVL.EF as EF

-- (2 + 3) * 4
intExpr = Fx $ (Fx $ (Fx $ CInt 2) `Add` (Fx $ CInt 3)) `Mul` (Fx $ CInt 4)

-- 4 / (3 - 1)
anotherIntExpr = Fx $ (Fx $ CInt 4) `Div` (Fx $ (Fx $ CInt 3) `Sub` (Fx $ CInt 1))

-- (False || True) && True
boolExpr = Fx $ (Fx $ (Fx $ CBool False) `Or` (Fx $ CBool True)) `And` (Fx $ CBool True)

-- !True
notExpr = Fx $ Not (Fx $ CBool True)

-- (2 + 3) = 4
eqlExpr = Fx $ (Fx $ (Fx $ CInt 2) `Add` (Fx $ CInt 3)) `Equal` (Fx $ CInt 4)

-- False || 500
badExpr = Fx $ (Fx $ CBool False) `Or` (Fx $ CInt 500)

-- If True Then 3 Else 4
ifExpr = Fx $ (If (Fx $ CBool True) (Fx $ CInt 3) (Fx $ CInt 4)) 

-- Function x -> True && x
funExpr = Fx $ Function "x" (Fx $ And (Fx $ CBool True) (Fx $ CVar "x"))

-- (Function x -> x + 4) 2
applExpr = Fx $ Appl (Fx $ Function "x" (Fx $ Add (Fx $ CVar "x") (Fx $ CInt 4))) (Fx $ CInt 2)

-- Let Rec f x = If x = 0 Then 0 Else x + f (x - 1) In f 3
letRecExpr = let eql = Fx $ Equal (Fx $ CVar "x") (Fx $ CInt 0) in
    let appl = Fx $ Appl (Fx $ CVar "f") (Fx $ Add (Fx $ CVar "x") (Fx $ CInt (-1))) in
    let els = Fx $ Add (Fx $ CVar "x") appl in
    let ifstmt = Fx $ If eql (Fx $ CInt 0) els
    in Fx $ LetRec "f" "x" ifstmt (Fx $ Appl (Fx $ CVar "f") (Fx $ CInt 3))

-- Let Rec f x = Function y -> If x = 0 Then If y = 0 Then 0 Else y + f x (y - 1) Else x + f (x - 1) y
-- In f 3 3
twoArgRecExpr = let eql s = Fx $ Equal (Fx $ CVar s) (Fx $ CInt 0) in
    let min s = Fx $ Sub (Fx $ CVar s) (Fx $ CInt 1) in
    let tripapp f x y = Fx $ Appl (Fx $ Appl (Fx $ CVar f) x) y in
    let xadd = Fx $ Add (Fx $ CVar "x") (tripapp "f" (min "x") (Fx $ CVar "y")) in
    let yadd = Fx $ Add (Fx $ CVar "y") (tripapp "f" (Fx $ CVar "x") (min "y")) in
    let innerif = Fx $ If (eql "y") (Fx $ CInt 0) yadd in
    let ifstmt = Fx $ If (eql "x") innerif xadd in
    let fun = Fx $ Function "y" ifstmt
    in Fx $ LetRec "f" "x" fun (tripapp "f" (Fx $ CInt 3) (Fx $ CInt 3))

-- Let x = 4 In x + 4
letExpr = Fx $ EF.Let "x" [] (Fx $ EF.CInt 4) (Fx $ EF.Add (Fx $ EF.CVar "x") (Fx $ EF.CInt 4))

-- 4; True
semiExpr = Fx $ EF.Semi (Fx $ EF.CInt 4) (Fx $ EF.CBool True)

-- Let f x y = x - y In f 4 5
eefLetExpr = let add = Fx $ EF.Sub (Fx $ EF.CVar "x") (Fx $ EF.CVar "y") in
    let innerappl = Fx $ EF.Appl (Fx $ EF.CVar "f") (Fx $ EF.CInt 4) in
    let appl = Fx $ EF.Appl innerappl (Fx $ EF.CInt 5)
    in Fx $ EF.Let "f" ["x", "y"] add appl

-- Let f x y = If x = 0 Then If y = 0 Then 0 Else y + f x (y - 1) Else x + f (x - 1) y In f 3 3
recExpr = let eql s = Fx $ EF.Equal (Fx $ EF.CVar s) (Fx $ EF.CInt 0) in
    let min s = Fx $ EF.Sub (Fx $ EF.CVar s) (Fx $ EF.CInt 1) in
    let tripapp f x y = Fx $ EF.Appl (Fx $ EF.Appl (Fx $ EF.CVar f) x) y in
    let xadd = Fx $ EF.Add (Fx $ EF.CVar "x") (tripapp "f" (min "x") (Fx $ EF.CVar "y")) in
    let yadd = Fx $ EF.Add (Fx $ EF.CVar "y") (tripapp "f" (Fx $ EF.CVar "x") (min "y")) in
    let innerif = Fx $ EF.If (eql "y") (Fx $ EF.CInt 0) yadd in
    let ifstmt = Fx $ EF.If (eql "x") innerif xadd
    in Fx $ EF.Let "f" ["x", "y"] ifstmt (tripapp "f" (Fx $ EF.CInt 3) (Fx $ EF.CInt 3))

intS = "1"

boolS = "True"

varS = "hello"

addS = "4 + 6 + 45"

subS = "784 - 84"

mulS = "5 * 5"

divS = "56 / 32"

andS = "True && False"

orS = "True || False"

notS = "!False"

equalS = "67 = 45"

ifS = "If 5 = 5 Then 5 Else 6"

functionS = "Function x -> x + 56"

applS = "(Function x -> True && x) False"

letS = "Let f x = If x = 0 Then 0 Else x + (f (x - 1)) In f 3"

semiS = "True; 75"

crazyLetS = "Let f x y z = Function w -> If w = 0 Then 0 Else f w x y z In f 1 1 1 0"

intListS = "[0, 1, 2, 5]"

boolListS = "[True, False, False]"

listCaseS = "Case [1, 2, 3, 4, 5] Of [] -> [3, 4] | (x:xs) -> x : xs"

listFunS = "(Function x -> Case x Of [] -> True | (x:xs) -> x && True) [True, False, True]"

main = do
    putStrLn "strict expressions::\n--------------------"
    mapM_ print [ F.run  intExpr
                , F.run  anotherIntExpr
                , F.run  boolExpr
                , F.run  notExpr
                , F.run  eqlExpr
                , F.run  badExpr
                , F.run  ifExpr
                , F.run  funExpr
                , F.run  applExpr
                , F.run  letRecExpr
                , F.run  twoArgRecExpr
                , EF.run letExpr
                , EF.run semiExpr
                , EF.run recExpr
                , EF.run eefLetExpr
                ]
    putStrLn "parsed expressions::\n--------------------"
    mapM_ print [ EF.parseRun intS
                , EF.parseRun boolS
                , EF.parseRun varS
                , EF.parseRun addS
                , EF.parseRun subS
                , EF.parseRun mulS
                , EF.parseRun divS
                , EF.parseRun andS
                , EF.parseRun orS
                , EF.parseRun notS
                , EF.parseRun equalS
                , EF.parseRun ifS
                , EF.parseRun functionS
                , EF.parseRun applS
                , EF.parseRun letS
                , EF.parseRun semiS
                , EF.parseRun crazyLetS
                , EF.parseRun intListS
                , EF.parseRun boolListS
                , EF.parseRun listCaseS
                , EF.parseRun listFunS
                ]