Skip to content

Commit 35457fe

Browse files
committed
poor mans pointers...
1 parent e69404e commit 35457fe

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

src/AllInOne.hs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Text.Parsec
88
import Data.Functor.Identity (Identity)
99
import System.IO (hSetEncoding, stdin, stdout, utf8)
1010

11+
1112
type Parser = Parsec String ()
1213

1314
infixl 5 :@
@@ -122,13 +123,59 @@ fun opt (sapp(sapp(scomb S,sapp(scomb K,e)),scomb I)) = (e : snode)
122123
123124
-}
124125

126+
-- graph allocation
127+
type Pointer = Int
128+
129+
data Graph =
130+
Node Pointer Pointer
131+
| Comb String
132+
| Num Integer
133+
deriving Show
134+
135+
allocate :: Expr -> [(Pointer, Graph)]
136+
allocate expr =
137+
alloc expr 1 []
138+
where
139+
maxPointer :: [(Pointer, Graph)] -> Pointer
140+
maxPointer x = maximum $ map fst x
141+
142+
alloc :: Expr -> Int -> [(Int, Graph)] -> [(Int, Graph)]
143+
alloc (Var name) pointer memMap = (pointer, Comb name) : memMap
144+
alloc (Int val) pointer memMap = (pointer, Num val) : memMap
145+
alloc (l :@ r) pointer memMap =
146+
let pointerL = pointer+1
147+
allocL = alloc l pointerL []
148+
maxL = maxPointer allocL
149+
pointerR = maxL + 1
150+
allocR = alloc r pointerR []
151+
maxR = maxPointer allocR
152+
in
153+
(pointer, Node pointerL pointerR) : (allocL ++ allocR ++ memMap)
154+
alloc (Lam _ _) pointer memMap = error "lambdas should already be abstracted"
155+
156+
spine :: Graph -> [(Pointer, Graph)] -> [Graph]-> (Graph, [Graph])
157+
spine c@(Comb _) mm stack = (c, stack)
158+
spine n@(Num _) mm stack = (n, stack)
159+
spine g@(Node l r) mm stack = spine (getNode l mm) mm (g:stack)
160+
where
161+
getNode :: Pointer -> [(Pointer, Graph)] -> Graph
162+
getNode p mm = case lookup p mm of
163+
Nothing -> error $ "deref " ++ show p ++ " in " ++ show mm
164+
Just g -> g
165+
166+
167+
-- parse a lambda expression
125168
toSK :: String -> Either ParseError Expr
126169
toSK s = do
127170
env <- parse source "" (s ++ "\n")
128171
case lookup "main" env of
129172
Nothing -> Left $ error "missing main function!"
130173
Just t -> pure $ ropt $ babs env t
131174

175+
getSK :: Either ParseError Expr -> Expr
176+
getSK (Right exp) = exp
177+
getSK _ = Var "error"
178+
132179
red :: Expr -> Expr
133180
red i@(Int _i) = i
134181
red (Var "i" :@ x) = x

0 commit comments

Comments
 (0)