@@ -156,16 +156,31 @@ allocate expr =
156156 (pointer, Node pointerL pointerR) : (allocL ++ allocR ++ memMap)
157157 alloc (Lam _ _) pointer memMap = error " lambdas should already be abstracted"
158158
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)
163163 where
164164 getNode :: Pointer -> [(Pointer , Graph )] -> Graph
165165 getNode p mm = case lookup p mm of
166166 Nothing -> error $ " deref " ++ show p ++ " in " ++ show mm
167167 Just g -> g
168168
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+
169184--- allocation with IORefs
170185data Graf =
171186 Nod (IO (IORef Graf )) (IO (IORef Graf ))
@@ -269,6 +284,13 @@ main = do
269284 putStrLn $ " compiled to SKI: " ++ showSK sk
270285 putStrLn $ " as graph: " ++ show sk
271286 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+
272294 -- putStrLn $ "encoded: " ++ show (I.fromAscList $ zip [0..] $ encodeTree sk)
273295 -- putStrLn $ "run it: " ++ show (run (I.fromAscList $ zip [0..] $ encodeTree sk) [4])
274296
0 commit comments