author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
Wed, 16 Jan 2019 17:15:58 +0000 | |
changeset 438 | 1fe179d53161 |
parent 347 | 0d1708315b2d |
permissions | -rw-r--r-- |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
1 |
import System.IO |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
2 |
import SimpleSexp |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
3 |
import Text.Show.Functions |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
4 |
import Data.Set as Set |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
5 |
import Data.List as List |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
6 |
import Control.Monad.State |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
7 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
8 |
type Handler = Immediate -> [AbsVal] -> PE AbsVal |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
9 |
type Symbol = String |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
10 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
11 |
data Immediate = A Atom |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
12 |
| P Symbol Handler |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
13 |
deriving Show |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
14 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
15 |
data AST = Lit Immediate |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
16 |
| Ref Symbol |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
17 |
| If AST AST AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
18 |
| Lambda [Symbol] AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
19 |
| Apply AST [AST] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
20 |
| Bind Symbol AST AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
21 |
-- | Letrec [Symbol] [AST] AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
22 |
deriving Show |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
23 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
24 |
data AbsVal = Unknown Symbol |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
25 |
| Runtime Symbol Description |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
26 |
| Compiletime Description |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
27 |
deriving Show |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
28 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
29 |
data Description = Simple Immediate |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
30 |
| Pair AbsVal AbsVal |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
31 |
| Closure [Symbol] AST Environment |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
32 |
deriving Show |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
33 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
34 |
type Environment = [(Symbol, AbsVal)] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
35 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
36 |
type Era = [(Symbol, (AST, AbsVal))] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
37 |
type History = [Era] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
38 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
39 |
type PEState = (Integer, History) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
40 |
type PE a = State PEState a |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
41 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
42 |
data MaybeKnown = NotKnown Symbol |
345
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
43 |
| Known Description |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
44 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
45 |
freeNames (Lit v) = Set.empty |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
46 |
freeNames (Ref id) = Set.singleton id |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
47 |
freeNames (If test true false) = Set.unions $ List.map freeNames [test, true, false] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
48 |
freeNames (Lambda formals body) = Set.difference (freeNames body) (Set.fromList formals) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
49 |
freeNames (Apply rator rands) = Set.unions $ List.map freeNames (rator : rands) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
50 |
freeNames (Bind name init body) = Set.union (freeNames init) (Set.delete name (freeNames body)) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
51 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
52 |
getHistory :: PE History |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
53 |
getHistory = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
54 |
(_, hs) <- get |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
55 |
return hs |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
56 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
57 |
nextId :: String -> PE Symbol |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
58 |
nextId base = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
59 |
(n, hs) <- get |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
60 |
put (n + 1, hs) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
61 |
return $ base ++ show n |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
62 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
63 |
emit :: String -> AST -> (Symbol -> PE AbsVal) -> PE AbsVal |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
64 |
emit base ast gen_av = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
65 |
id <- nextId base |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
66 |
av <- gen_av id |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
67 |
(n, (h : hs)) <- get |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
68 |
put (n, ((id, (ast, av)) : h) : hs) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
69 |
return av |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
70 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
71 |
lookupEnv' :: Environment -> History -> Symbol -> AbsVal |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
72 |
lookupEnv' env hs id = case lookup id env of |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
73 |
Nothing -> do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
74 |
case lookup id (concat hs) of |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
75 |
Nothing -> error $ "Unbound variable: " ++ id |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
76 |
Just (ast, av) -> av |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
77 |
Just av -> av |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
78 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
79 |
lookupEnv :: Environment -> Symbol -> PE AbsVal |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
80 |
lookupEnv env id = do hs <- getHistory |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
81 |
return $ lookupEnv' env hs id |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
82 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
83 |
maybeKnown :: AbsVal -> MaybeKnown |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
84 |
maybeKnown (Unknown id) = NotKnown id |
345
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
85 |
maybeKnown (Runtime id d) = Known d |
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
86 |
maybeKnown (Compiletime d) = Known d |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
87 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
88 |
pushHistory :: PE () |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
89 |
pushHistory = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
90 |
(n, hs) <- get |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
91 |
put (n, [] : hs) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
92 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
93 |
popHistory :: PE Era |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
94 |
popHistory = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
95 |
(n, h : hs) <- get |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
96 |
put (n, hs) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
97 |
return h |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
98 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
99 |
codegen :: PE AbsVal -> PE AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
100 |
codegen block = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
101 |
pushHistory |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
102 |
av <- block |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
103 |
h <- popHistory |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
104 |
return $ wrapEra h (codegenAbsVal av) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
105 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
106 |
wrapEra :: Era -> AST -> AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
107 |
wrapEra [] body = body |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
108 |
wrapEra ((id, (ast, av)) : h) (Ref ref) | id == ref = wrapEra h ast |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
109 |
wrapEra ((id, (ast, av)) : h) body = wrapEra h (Bind id ast body) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
110 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
111 |
codegenAbsVal :: AbsVal -> AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
112 |
codegenAbsVal (Unknown id) = Ref id |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
113 |
codegenAbsVal (Runtime id _) = Ref id |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
114 |
codegenAbsVal (Compiletime d) = codegenDescription d |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
115 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
116 |
codegenDescription :: Description -> AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
117 |
codegenDescription (Simple i) = Lit i |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
118 |
codegenDescription (Pair a d) = Apply (Lit primCons) $ List.map codegenAbsVal [a, d] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
119 |
codegenDescription (Closure formals body env) = Lambda formals body |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
120 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
121 |
primCons = P "cons" primConsHandler |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
122 |
primConsHandler self [a, d] = emit "pair" |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
123 |
(Apply (Lit self) $ List.map codegenAbsVal [a, d]) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
124 |
(\pairid -> return $ Runtime pairid $ Pair a d) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
125 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
126 |
pe :: Environment -> AST -> PE AbsVal |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
127 |
pe env (Lit v) = return $ Compiletime $ Simple v |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
128 |
pe env (Ref id) = lookupEnv env id |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
129 |
pe env (If test true false) = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
130 |
testv <- pe env test |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
131 |
case maybeKnown testv of |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
132 |
NotKnown testid -> do t <- codegen $ pe env true |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
133 |
f <- codegen $ pe env false |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
134 |
emit "if" (If (Ref testid) t f) (return . Unknown) |
345
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
135 |
Known (Simple (A (Int 0))) -> pe env false |
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
136 |
Known _ -> pe env true |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
137 |
pe env p@(Lambda formals body) = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
138 |
hs <- getHistory |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
139 |
let cloenv = [(id, lookupEnv' env hs id) | id <- Set.toList $ freeNames p, boundIn env id] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
140 |
b <- codegen $ pe (bindFormals cloenv formals) body |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
141 |
let clo = Closure formals b cloenv |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
142 |
emit "lam" (codegenDescription clo) (\lamid -> return $ Runtime lamid clo) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
143 |
pe env (Apply rator rands) = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
144 |
ratorv <- pe env rator |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
145 |
randsv <- mapM (pe env) rands |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
146 |
case maybeKnown ratorv of |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
147 |
NotKnown ratorid -> |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
148 |
emit "app" (Apply (Ref ratorid) (List.map codegenAbsVal randsv)) (return . Unknown) |
345
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
149 |
Known (Closure formals body cloenv) -> |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
150 |
pe (bindActuals env formals randsv) body |
345
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
151 |
Known (Simple p@(P name handler)) -> |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
152 |
handler p randsv |
345
11b385f4d2b6
Simplify MaybeKnown
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
344
diff
changeset
|
153 |
Known other -> error ("Cannot apply non-procedure: " ++ show other) |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
154 |
pe env (Bind formal init body) = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
155 |
initv <- pe env init |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
156 |
pe (bindActuals env [formal] [initv]) body |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
157 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
158 |
boundIn :: Environment -> Symbol -> Bool |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
159 |
boundIn env id = case lookup id env of |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
160 |
Nothing -> False |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
161 |
Just _ -> True |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
162 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
163 |
bindFormals :: Environment -> [Symbol] -> Environment |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
164 |
bindFormals env formals = [(f, Unknown f) | f <- formals] ++ env |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
165 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
166 |
bindActuals :: Environment -> [Symbol] -> [AbsVal] -> Environment |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
167 |
bindActuals env formals actuals = zip formals actuals ++ env |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
168 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
169 |
partialEval :: Environment -> AST -> AST |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
170 |
partialEval env term = |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
171 |
let (ast, (_n, [])) = runState (codegen $ pe env term) (0, []) in ast |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
172 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
173 |
reconstruct :: AST -> Sexp |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
174 |
reconstruct (Lit (A a)) = Atom a |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
175 |
reconstruct (Lit (P name _)) = Atom (Symbol $ "#%" ++ name) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
176 |
reconstruct (Ref id) = Atom (Symbol id) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
177 |
reconstruct (If test true false) = List [Atom (Symbol "if"), |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
178 |
reconstruct test, |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
179 |
reconstruct true, |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
180 |
reconstruct false] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
181 |
reconstruct (Lambda formals body) = List [Atom (Symbol "lambda"), |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
182 |
List $ List.map (Atom . Symbol) formals, |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
183 |
reconstruct body] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
184 |
reconstruct (Apply rator rands) = List ([reconstruct rator] ++ List.map reconstruct rands) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
185 |
reconstruct (Bind name init body) = reconstructBinds [(name, init)] body |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
186 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
187 |
reconstructBinds :: [(Symbol, AST)] -> AST -> Sexp |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
188 |
reconstructBinds bs (Bind name init body) = reconstructBinds ((name, init) : bs) body |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
189 |
reconstructBinds bs body = |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
190 |
List [Atom (Symbol "let*"), |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
191 |
List [List [Atom (Symbol name), reconstruct init] | (name, init) <- reverse bs], |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
192 |
reconstruct body] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
193 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
194 |
parse (Atom (Symbol s)) = Ref s |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
195 |
parse (List [Atom (Symbol "quote"), Atom e]) = Lit (A e) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
196 |
parse (List [Atom (Symbol "if"), test, true, false]) = If (parse test) (parse true) (parse false) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
197 |
parse (List (Atom (Symbol "lambda") : List formals : es)) = |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
198 |
Lambda (List.map parseSym formals) (parseSeq es) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
199 |
parse (List (Atom (Symbol "let") : List bindings : es)) = |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
200 |
Apply (Lambda (List.map bindingName bindings) (parseSeq es)) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
201 |
(List.map (parse . bindingInit) bindings) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
202 |
parse (List (Atom (Symbol "let*") : List bindings : es)) = |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
203 |
List.foldl (\ e b -> Bind (bindingName b) (parse $ bindingInit b) e) (parseSeq es) bindings |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
204 |
parse (List (rator : rands)) = Apply (parse rator) (List.map parse rands) |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
205 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
206 |
parseSeq [e] = parse e |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
207 |
parseSeq (e:es) = Apply (Lambda ["__ ignored __"] (parseSeq es)) [parse e] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
208 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
209 |
parseSym (Atom (Symbol s)) = s |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
210 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
211 |
bindingName (List [Atom (Symbol n), e]) = n |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
212 |
bindingInit (List [Atom (Symbol n), e]) = e |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
213 |
|
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
214 |
main = do |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
215 |
let exampleSource = "(lambda (bb) ((lambda (k b) (k (lambda () b))) (lambda (f) (f)) (bb)))" |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
216 |
let Right [exampleSexp] = readSexps exampleSource |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
217 |
let example = parse exampleSexp |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
218 |
-- let example = Lambda ["bb"] $ Apply (Lambda ["k", "b"] $ Apply (Ref "k") [Lambda [] (Ref "b")]) |
347
0d1708315b2d
Bring pe3.hs (commented-out) example into line with the S-expression version!
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
346
diff
changeset
|
219 |
-- [Lambda ["f"] (Apply (Ref "f") []), |
344
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
220 |
-- Apply (Ref "bb") []] |
7bec5953dbb2
Haskell pe3 implementation, showing how to correct pe3.rkt
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
221 |
putStrLn $ showSexp $ reconstruct $ partialEval [] example |