@@ -8,6 +8,7 @@ import Text.Parsec
88import Data.Functor.Identity (Identity )
99import System.IO (hSetEncoding , stdin , stdout , utf8 )
1010
11+
1112type Parser = Parsec String ()
1213
1314infixl 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
125168toSK :: String -> Either ParseError Expr
126169toSK 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+
132179red :: Expr -> Expr
133180red i@ (Int _i) = i
134181red (Var " i" :@ x) = x
0 commit comments