@@ -156,16 +156,31 @@ allocate expr =
156
156
(pointer, Node pointerL pointerR) : (allocL ++ allocR ++ memMap)
157
157
alloc (Lam _ _) pointer memMap = error " lambdas should already be abstracted"
158
158
159
- spine :: Graph -> [(Pointer , Graph )] -> [Graph ]-> (Graph , [Graph ])
160
- spine c@ (Comb _) mm stack = (c, stack)
161
- spine n@ (Num _) mm stack = (n, stack)
162
- spine g@ (Node l r) mm stack = spine (getNode l mm) mm (g: stack)
159
+ spine' :: Graph -> [(Pointer , Graph )] -> [Graph ]-> (Graph , [Graph ])
160
+ spine' c@ (Comb _) mm stack = (c, stack)
161
+ spine' n@ (Num _) mm stack = (n, stack)
162
+ spine' g@ (Node l r) mm stack = spine' (getNode l mm) mm (g: stack)
163
163
where
164
164
getNode :: Pointer -> [(Pointer , Graph )] -> Graph
165
165
getNode p mm = case lookup p mm of
166
166
Nothing -> error $ " deref " ++ show p ++ " in " ++ show mm
167
167
Just g -> g
168
168
169
+ spine :: IORef Graf -> [IORef Graph ]-> (IORef Graph , [IORef Graph ])
170
+ spine ioRefGraph stack = case ioRefGraph of
171
+ IORef (Com c) -> (ioRefGraph, stack)
172
+ IORef (Numb i) -> (ioRefGraph, stack)
173
+ IORef (Node l r) -> spine l (ioRefGraph: stack)
174
+
175
+ -- spine c@(Comb _) mm stack = (c, stack)
176
+ -- spine n@(Num _) mm stack = (n, stack)
177
+ -- spine g@(Node l r) mm stack = spine (getNode l mm) mm (g:stack)
178
+ -- where
179
+ -- getNode :: Pointer -> [(Pointer, Graph)] -> Graph
180
+ -- getNode p mm = case lookup p mm of
181
+ -- Nothing -> error $ "deref " ++ show p ++ " in " ++ show mm
182
+ -- Just g -> g
183
+
169
184
--- allocation with IORefs
170
185
data Graf =
171
186
Nod (IO (IORef Graf )) (IO (IORef Graf ))
@@ -269,6 +284,13 @@ main = do
269
284
putStrLn $ " compiled to SKI: " ++ showSK sk
270
285
putStrLn $ " as graph: " ++ show sk
271
286
putStrLn $ " reduce: " ++ show (reduce sk)
287
+ let sk = getSK (toSK " main = c i 2 (+ 1)" )
288
+ print sk
289
+ let g = alloc sk
290
+ deallocG <- dealloc g
291
+ print deallocG
292
+
293
+
272
294
-- putStrLn $ "encoded: " ++ show (I.fromAscList $ zip [0..] $ encodeTree sk)
273
295
-- putStrLn $ "run it: " ++ show (run (I.fromAscList $ zip [0..] $ encodeTree sk) [4])
274
296
0 commit comments