From f26ac50d4e0a837ca6e3bedc935835246d8306c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Tue, 1 Sep 2026 05:05:45 -0600 Subject: [PATCH] hoist --- gyehoek.cabal | 10 +- src/Gyehoek/CPS/Close.hs | 53 ++++++---- src/Gyehoek/CPS/Contify.hs | 67 ++++++++++++ src/Gyehoek/CPS/Hoist.hs | 24 +++++ src/Gyehoek/CPS/Stackify.hs | 192 ++++++++++++++++++++++++----------- src/Gyehoek/CPS/Syntax.hs | 48 +++++++++ src/Gyehoek/Driver.hs | 12 ++- src/Gyehoek/Options.hs | 4 + src/Gyehoek/Scheme/Syntax.hs | 6 ++ stack.rnote | Bin 0 -> 50994 bytes 10 files changed, 329 insertions(+), 87 deletions(-) create mode 100644 src/Gyehoek/CPS/Contify.hs create mode 100644 src/Gyehoek/CPS/Hoist.hs create mode 100644 stack.rnote diff --git a/gyehoek.cabal b/gyehoek.cabal index 4d50143..c0f3264 100644 --- a/gyehoek.cabal +++ b/gyehoek.cabal @@ -58,14 +58,16 @@ library -- cabal-fmt: expand src exposed-modules: Gyehoek.CPS.Close + Gyehoek.CPS.Contify Gyehoek.CPS.Convert Gyehoek.CPS.Eval + Gyehoek.CPS.Hoist Gyehoek.CPS.Stackify Gyehoek.CPS.Syntax Gyehoek.Driver - Gyehoek.Language Gyehoek.GenSym Gyehoek.Jalmot + Gyehoek.Language Gyehoek.Lift1 Gyehoek.Options Gyehoek.Prelude @@ -100,6 +102,7 @@ library , hashable , invertible-grammar , lens + , lucid , megaparsec , mtl , optparse-applicative @@ -107,6 +110,7 @@ library , pretty-simple , prettyprinter , prettyprinter-ansi-terminal + , prettyprinter-lucid , process , recursion-schemes , scientific @@ -117,8 +121,7 @@ library , typed-process , unordered-containers , vector - , lucid - , prettyprinter-lucid + , tardis hs-source-dirs: src default-language: GHC2024 @@ -171,6 +174,7 @@ test-suite doctest build-depends: , base , gyehoek + default-extensions: CPP main-is: doctest.hs diff --git a/src/Gyehoek/CPS/Close.hs b/src/Gyehoek/CPS/Close.hs index 619a046..d715c2c 100644 --- a/src/Gyehoek/CPS/Close.hs +++ b/src/Gyehoek/CPS/Close.hs @@ -7,32 +7,43 @@ import Gyehoek.CPS.Syntax import Data.List (nub) import Gyehoek.GenSym import Gyehoek.Prelude +import Debug.Pretty.Simple +import Gyehoek.Sexp qualified as S +import Data.HashSet.Lens +import Data.Traversable +genCodeName :: GenSym :> es => Name -> Eff es Name +genCodeName f = gensym' @Name $ f ^. _Wrapped' . to (<> "-code") + +bindEnv :: Name -> List Name -> Exp -> Exp +bindEnv l frees m = [cps| + (letrec ((#{l} (κ #{frees} #{m}))) + (prim (get-env) #{l})) +|] + close :: forall es. GenSym :> es => Exp -> Eff es Exp close = transformM \case - ExpLetRec [(f, AbsLambda lam@(MkLambda bs kb m))] e -> do - f_code <- gensym' @Name $ f ^. _Wrapped' . to (<> "-code") - -- it would probably be most sane to generate a symbol for `env`, - -- but we're reusing the lambda binding so we don't have to - -- explicitly substitute recursive calls. - let frees = nub $ free' lam - m' <- ifoldrM @_ @_ @(Eff es) - (\n x q -> do - q_l <- gensym' @Name "env-cont" - let p = if x == f then PrimEnv @Val else PrimEnvRef n - pure [cps| - (letrec ((#{q_l} (κ (#{x}) #{q}))) - (prim #{p} - #{q_l})) - |]) - m frees - e_l <- gensym' @Name "make-closure-cont" + ExpLetRec bs e -> do + let boundNames = bs ^.. each . _1 + let frees = bs + & foldMapOf + (each . _2 . absBody) + (freeWithBound' $ setOf (each . _1) bs) + & nub + env_cont_l <- gensym' @Name "env-cont" + e_l <- gensym' @Name "letrec-body-cont" + -- let ab' = ab & absBody .~ m' + bs' <- for bs \(f,ab) -> do + f_code_l <- genCodeName f + pure + ( f_code_l + , ab & absBody %~ bindEnv f_code_l (boundNames ++ frees) + ) pure [cps| - (letrec ((#{f_code} (λ (##{bs} #{kb}) - #{m'}))) - (letrec ((#{e_l} (κ (#{f}) #{e}))) - (prim (make-closure #{f_code} ##{frees}) + (letrec #{bs'} + (letrec ((#{e_l} (κ #{boundNames} #{e}))) + (prim (make-shared-closure #{boundNames} #{frees}) #{e_l}))) |] diff --git a/src/Gyehoek/CPS/Contify.hs b/src/Gyehoek/CPS/Contify.hs new file mode 100644 index 0000000..a481e46 --- /dev/null +++ b/src/Gyehoek/CPS/Contify.hs @@ -0,0 +1,67 @@ +{-# LANGUAGE ApplicativeDo #-} +module Gyehoek.CPS.Contify + ( contifyProgram + ) where + +import Control.Monad.Tardis +import Gyehoek.CPS.Syntax +import Gyehoek.Prelude +import qualified Data.HashSet as HS +import Control.Lens.Unsound (adjoin) +import Debug.Pretty.Simple +import qualified Data.HashMap.Strict as H +import Control.Monad.Writer.Lazy +import Control.Monad.Trans.Tardis (liftTardisT) + + +-- | ain't no way... +-- type T = WriterT (HashSet Name) (Tardis (HashSet Name) (HashSet Name)) +type T = TardisT (HashSet Name) (HashSet Name) (Writer (HashSet Name)) + +evalT :: T a -> a +-- evalT = (`evalTardis` (mempty,mempty)) . fmap fst . runWriterT +evalT = fst . runWriter . (`evalTardisT` (mempty,mempty)) + +runT :: T a -> (a, HashSet Name) +-- runT = (`evalTardis` (mempty,mempty)) . runWriterT +runT = runWriter . (`evalTardisT` (mempty,mempty)) + +-- | inline function if it hasn't been used in the past, and won't +-- be used in the future. +tryInline :: Name -> Kappa -> T Kexp +tryInline kname kap = do + modifyBackwards (HS.insert kname) + p <- getsPast (HS.member kname) + modifyForwards (HS.insert kname) + q <- getsFuture (HS.member kname) + let c = p || q + liftTardisT . tell $ if c then HS.singleton kname else mempty + pure $ if c + then KexpVar kname + else KexpKappa kap + +getKap :: HashMap Name Abs -> Name -> Maybe Kappa +getKap g kname = g ^? ix kname . #AbsKappa + +contify :: HashMap Name Abs -> Exp -> T Exp +contify g = transformM \case + ExpApply f xs (KexpVar kname) | Just kap <- getKap g kname + -> ExpApply f xs <$> tryInline kname kap + ExpPrim p (KexpVar kname) | Just kap <- getKap g kname + -> ExpPrim p <$> tryInline kname kap + e -> pure e + +contifyProgram :: HoistedProgram -> Eff es HoistedProgram +contifyProgram p = do + let g = p.bindings + let (p',contifiedVars) = + runT $ + traverseOf + (adjoin + (#bindings . each . body) + (#body . body)) + (contify g) + p + pTraceShowM contifiedVars + -- pure $ p' & #bindings %~ H.filterWithKey \k _ -> HS.member k contifiedVars + pure p' diff --git a/src/Gyehoek/CPS/Hoist.hs b/src/Gyehoek/CPS/Hoist.hs new file mode 100644 index 0000000..0031132 --- /dev/null +++ b/src/Gyehoek/CPS/Hoist.hs @@ -0,0 +1,24 @@ +module Gyehoek.CPS.Hoist + ( hoistProgram + ) where + +import Gyehoek.CPS.Syntax +import Gyehoek.Prelude +import qualified Data.HashMap.Strict as H +import Effectful.Writer.Static.Local +import Data.Foldable + + +type Hoist = Writer (HashMap Name Abs) + +hoist :: Hoist :> es => Exp -> Eff es Exp +hoist = transformM \case + ExpLetRec bs m -> do + traverse_ (\(k,v) -> tell $ H.singleton k v) bs + pure m + e -> pure e + +hoistProgram :: Program -> Eff es HoistedProgram +hoistProgram p = do + (body,bindings) <- runWriter $ traverseOf #body hoist p.body + pure $ MkHoistedProgram {body,bindings} diff --git a/src/Gyehoek/CPS/Stackify.hs b/src/Gyehoek/CPS/Stackify.hs index 8085347..4896873 100644 --- a/src/Gyehoek/CPS/Stackify.hs +++ b/src/Gyehoek/CPS/Stackify.hs @@ -54,28 +54,27 @@ emitRoutine :: Stackify :> es => Stk.Routine -> Eff es () emitRoutine rt = tell [rt] stackify - :: (GenSym :> es, Stackify :> es) + :: forall es. (GenSym :> es, Stackify :> es) => Env -> Exp -> Eff es BlockBuilder -stackify g (ExpLetRec [(f, AbsKappa kap)] e) = do - kap' <- stackifyKappa g kap - emitRoutine . Stk.MkRoutine (MkLabel f) . buildBlock $ kap' - stackify g e - -stackify g (ExpLetRec [(f, AbsLambda lam)] e) = do - lam' <- stackifyLambda g (MkLabel f) lam - emitRoutine lam' +stackify g (ExpLetRec bs e) = do + for_ bs \(f,a) -> + emitRoutine =<< case a of + AbsKappa kap -> stackifyKappa g (MkLabel f) kap + AbsLambda lam -> stackifyLambda g (MkLabel f) lam stackify g e stackify g (ExpIf c t f) = do let c' = stackifyVal g c - t' <- buildBlock <$> stackify g t - f' <- buildBlock <$> stackify g f - pure . Tail $ Stk.If c' t' f' + let jump l = + Stk.MkBlock + [Stk.Push . Stk.ValLabel . MkLabel $ l] + (Stk.TailCall 0) + pure . Tail $ Stk.If c' (jump t) (jump f) stackify g (ExpApply f xs ktail) = do pure $ - Code [ Stk.Push $ stackifyVal g (ValVar ktail) + Code [ Stk.Push $ stackifyVal g (ValVar $ ktail ^?! #KexpVar) , Stk.Push $ stackifyVal g f ] $ Code (pushArgs g xs) $ @@ -91,23 +90,24 @@ stackify g e@(ExpContinue k xs) Tail (Stk.Return (length xs)) stackify g (ExpPrim (PrimCallCC withcc) cc) = do - cc' <- stackifyKappa g cc + let cc' = cc ^?! #KexpVar . to MkLabel cc_l <- gensym' @Label "cc" - emitRoutine . Stk.MkRoutine cc_l . buildBlock $ cc' pure $ Code [ Stk.Push $ stackifyVal g withcc - , Stk.Push $ stackifyVal g (ValLabel cc_l) + , Stk.Push $ stackifyVal g (ValLabel cc') ] $ Tail Stk.CallCC -stackify g (ExpPrim p (MkKappa rs e)) = do - _ - pure $ Code [ Stk.Prim (stackifyVal g <$> p) ] _ +stackify g (ExpPrim p cc) = pure $ + Code [ Stk.Push (Stk.ValLabel . MkLabel $ cc ^?! #KexpVar) + , Stk.Prim (stackifyVal g <$> p) + ] $ + Tail $ Stk.TailCall 1 stackify _ e = error [i|unimplemented exp: #{e}|] -loadArgs :: Free a => Env -> a -> List Name -> List Stk.Instr -loadArgs g e = imapOf itraversed \n x -> load g e (MkReg x) n +loadArgs :: List Name -> List Stk.Instr +loadArgs = imapOf itraversed \n x -> Stk.Load (MkReg x) n pushArgs :: Env -> List Val -> List Stk.Instr pushArgs g args = [ Stk.Push $ stackifyVal g x | x <- reverse args ] @@ -118,12 +118,20 @@ _ValName = failing #_ValVar (#_ValImm . #_ImmLabel . #_MkLabel) stackifyKappa :: (Stackify :> es, GenSym :> es) - => Env -> Kappa - -> Eff es BlockBuilder -stackifyKappa g (MkKappa xs m) = do + => Env -> Label -> Kappa + -> Eff es Stk.Routine +stackifyKappa g kname (MkKappa xs m) = do let g' = g & #bound <>:~ xs - Code [ _ | x <- g'.bound `intersect` free' m ] - <$> stackify g' m + m' <- stackify g' m + pure $ + Stk.MkRoutine kname . buildBlock $ + Code (loadArgs xs) $ + Code [ Stk.Load (MkReg r) j + | v <- g ^.. #liveness . ix kname . each + , (j,r) <- itoListOf (#bound . itraversed) g + , r == v + ] $ + m' stackifyLambda :: (Stackify :> es, GenSym :> es) @@ -134,7 +142,8 @@ stackifyLambda g name (MkLambda xs k m) = do pure $ Stk.MkRoutine name . buildBlock $ Code (loadArgs xs) $ - Code [Stk.Load (MkReg k) (length xs + 1)] m' + -- Code [Stk.Load (MkReg k) (length xs + 1)] $ + m' stackifyVal :: Env -> Val -> Stk.Val stackifyVal g = \case @@ -171,40 +180,101 @@ emptyEnv = MkEnv -stackifyProgram :: GenSym :> es => Program -> Eff es Stk.Program -stackifyProgram (MkProgram lam) = do - let g = emptyEnv - (_,p) <- runStackify $ emitRoutine =<< stackifyLambda g "start" lam - pure p +stackifyProgram :: GenSym :> es => HoistedProgram -> Eff es Stk.Program +stackifyProgram p = do + let liveness = p & foldMapOf + (#bindings . itraversed . withIndex . aside #AbsKappa) + \(kname,kap) -> H.singleton + (MkLabel kname) + (nub $ freeWithBound' (H.keysSet p.bindings) kap) + let g = MkEnv + { bound = mempty + , liveness + , tail = p.body.ktail } + let e = p.body & #body %~ ExpLetRec (H.toList p.bindings) + (_,p') <- runStackify $ emitRoutine =<< stackifyLambda g "start" e + pure p' -letfn :: Program -letfn = [cps| -(λ (start-ktail0) - (letrec ((lambda-body1 - (λ (x lambda-tail2) - (prim (* x x) (κ (r3) (continue lambda-tail2 r3)))))) - (letrec ((let-body6 - (κ (square) - (letrec ((r4 (κ (x5) (continue start-ktail0 x5)))) - (square 4 r4))))) - (continue let-body6 lambda-body1)))) -|] - -blah :: Program +blah :: HoistedProgram blah = [cps| -(λ (ktail0) - (letrec ((fac (λ (n ktail) - (prim (zero? n) - (κ (x0) - (if x0 - (continue ktail 1) - (prim (- n 1) - (κ (x1) - (letrec ((fac-k0 - (κ (x2) - (prim (* n x2) - (κ (x3) - (continue ktail x3)))))) - (fac x1 fac-k0)))))))))) - (fac 6 halt))) +(letrec ((prim-k3 (κ (r2) (if r2 truthy-cont4 falsey-cont5))) + (prim-k7 (κ (r6) (fac r6 r8))) + (make-closure-cont15 (κ (fac) (fac 20 r12))) + (falsey-cont5 (κ () (prim (- n 1) prim-k7))) + (r12 (κ (x13) (continue start-ktail0 x13))) + (truthy-cont4 (κ () (continue lambda-tail1 1))) + (prim-k11 (κ (r10) (continue lambda-tail1 r10))) + (r8 (κ (x9) (prim (* n x9) prim-k11))) + (fac-code14 (λ (n lambda-tail1) (prim (zero? n) prim-k3)))) + (λ (start-ktail0) + (prim (make-closure $fac-code14) make-closure-cont15))) +|] + +p :: HoistedProgram +p = [cps| +(letrec ((r12-code32 (κ (r12 start-ktail0 x13) (continue start-ktail0 x13))) + (prim-k7-code22 + (κ (prim-k7 fac r6 r8 n x9 prim-k11 lambda-tail1 r10) + (prim + (make-shared-closure (r8) (n x9 prim-k11 lambda-tail1 r10)) + letrec-body-cont18))) + (letrec-body-cont24 + (κ (truthy-cont4 falsey-cont5) + (if r2 + truthy-cont4 + falsey-cont5))) + (letrec-body-cont18 (κ (r8) (fac r6 r8))) + (prim-k11-code16 + (κ (prim-k11 lambda-tail1 r10) + (continue lambda-tail1 r10))) + (falsey-cont5-code26 + (κ (truthy-cont4 falsey-cont5 lambda-tail1 n prim-k7 + fac r6 r8 x9 prim-k11 r10) + (prim + (make-shared-closure + (prim-k7) + (fac r6 r8 n x9 prim-k11 lambda-tail1 r10)) + letrec-body-cont21))) + (letrec-body-cont31 (κ (r12) (fac 20 r12))) + (r8-code19 + (κ (r8 n x9 prim-k11 lambda-tail1 r10) + (prim + (make-shared-closure (prim-k11) (lambda-tail1 r10)) + letrec-body-cont15))) + (letrec-body-cont28 (κ (prim-k3) (prim (zero? n) prim-k3))) + (truthy-cont4-code25 + (κ (truthy-cont4 falsey-cont5 lambda-tail1 n prim-k7 fac + r6 r8 x9 prim-k11 r10) + (continue lambda-tail1 1))) + (fac-code35 + (κ (fac n prim-k3 r2 truthy-cont4 falsey-cont5 lambda-tail1 + prim-k7 r6 r8 x9 prim-k11 r10) + (prim + (make-shared-closure + (prim-k3) + (r2 truthy-cont4 falsey-cont5 lambda-tail1 n prim-k7 + fac r6 r8 x9 prim-k11 r10)) + letrec-body-cont28))) + (prim-k3-code29 + (κ (prim-k3 r2 truthy-cont4 falsey-cont5 lambda-tail1 n prim-k7 + fac r6 r8 x9 prim-k11 r10) + (prim + (make-shared-closure + (truthy-cont4 falsey-cont5) + (lambda-tail1 n prim-k7 fac r6 r8 x9 prim-k11 r10)) + letrec-body-cont24))) + (letrec-body-cont21 (κ (prim-k7) (prim (- n 1) prim-k7))) + (letrec-body-cont15 (κ (prim-k11) (prim (* n x9) prim-k11))) + (letrec-body-cont34 + (κ (fac) + (prim + (make-shared-closure (r12) (start-ktail0 x13)) + letrec-body-cont31)))) + (λ (start-ktail0) + (prim + (make-shared-closure + (fac) + (n prim-k3 r2 truthy-cont4 falsey-cont5 lambda-tail1 + prim-k7 r6 r8 x9 prim-k11 r10)) + letrec-body-cont34))) |] diff --git a/src/Gyehoek/CPS/Syntax.hs b/src/Gyehoek/CPS/Syntax.hs index 011814c..409853e 100644 --- a/src/Gyehoek/CPS/Syntax.hs +++ b/src/Gyehoek/CPS/Syntax.hs @@ -15,6 +15,7 @@ module Gyehoek.CPS.Syntax , Name(..) , Prim(..) , Program(..) + , HoistedProgram(..) , Lit(..) , Imm(..) , Obj(..) @@ -40,6 +41,7 @@ module Gyehoek.CPS.Syntax , Free(..) , pattern ValLabel , pattern ObjLabel + , absBody ) where @@ -58,6 +60,8 @@ import qualified Data.InvertibleGrammar.Base as IG import Gyehoek.GenSym (Gen) import Data.String (IsString) import Control.Applicative +import qualified Data.HashMap.Strict as H +import GHC.Records (HasField (..)) -- Data types @@ -135,6 +139,7 @@ data Exp data Kexp = KexpVar Name + -- | Only to be used after contification. | KexpKappa Kappa deriving (Show, Generic, Data, Eq) @@ -152,6 +157,22 @@ data Program = MkProgram } deriving (Show, Generic, Data) +data HoistedProgram = MkHoistedProgram + { bindings :: HashMap Name Abs + , body :: Lambda + } + deriving stock (Show, Generic, Data) + +type instance Index HoistedProgram = Name +type instance IxValue HoistedProgram = Abs + +instance Ixed HoistedProgram where ix j = #bindings . ix j + +instance At HoistedProgram where at j = #bindings . at j + +instance Each HoistedProgram HoistedProgram Abs Abs where + each = #bindings . each + makePrisms ''Kappa makePrisms ''Exp makeFieldsId ''Exp @@ -175,6 +196,16 @@ _AbsLambda' = prism' instance Plated Exp where plate = uniplate + +absBody :: Lens' Abs Exp +absBody = lens + (\case + AbsLambda lam -> lam.body + AbsKappa kap -> kap.body) + (\cases + (AbsLambda lam) b -> AbsLambda $ lam & #body .~ b + (AbsKappa kap) b -> AbsKappa $ kap & #body .~ b) + -- DatumIso instances @@ -307,6 +338,22 @@ instance S.DatumIso Kexp where instance S.DatumIso Program where datumIso = S.with \prog -> S.datumIso @Lambda >>> prog +-- the printed representation is pretty dishonest in its current +-- state. consider the following hoisted program: +-- +-- (letrec ((k (κ () (continue start-ktail 123)))) +-- (λ (start-ktail) +-- (continue k))) +-- +-- here, `start-ktail` is bound in `k`, but the printed representation +-- fails to reflect that. +instance S.DatumIso HoistedProgram where + datumIso = S.with \prog -> + S.letLike "letrec" + (S.datumIso @Name) (S.datumIso @Abs) (S.datumIso @Lambda) + >>> S.onTail (S.iso H.fromList H.toList) + >>> prog + -- quasiquoters @@ -319,6 +366,7 @@ instance CPS Kappa where toCPS = S.fromDatumUnsafe S.datumIso instance CPS Lambda where toCPS = S.fromDatumUnsafe S.datumIso instance CPS Abs where toCPS = S.fromDatumUnsafe S.datumIso instance CPS Program where toCPS = S.fromDatumUnsafe S.datumIso +instance CPS HoistedProgram where toCPS = S.fromDatumUnsafe S.datumIso cps :: S.QuasiQuoter cps = S.makeSx' [| toCPS |] diff --git a/src/Gyehoek/Driver.hs b/src/Gyehoek/Driver.hs index 65497cb..8fd1397 100644 --- a/src/Gyehoek/Driver.hs +++ b/src/Gyehoek/Driver.hs @@ -35,6 +35,8 @@ import Control.Arrow ((>>>)) import Gyehoek.Prelude import Gyehoek.Jalmot import qualified Gyehoek.Sexp as S +import Gyehoek.CPS.Hoist (hoistProgram) +import Gyehoek.CPS.Contify (contifyProgram) main :: IO () @@ -122,9 +124,15 @@ driver opts = do closedCps <- closeProgram cps when opts.dumpClosed do hPutStrLn FS.stdout =<< S.encodeWith S.datumIso closedCps + hoistedCps <- hoistProgram closedCps + when opts.dumpHoisted do + hPutStrLn FS.stdout =<< S.encodeWith S.datumIso hoistedCps + -- contifiedCps <- contifyProgram hoistedCps + -- when opts.dumpContified do + -- hPutStrLn FS.stdout =<< S.encodeWith S.datumIso contifiedCps let rt_is p = is (_Just . p) opts.runtime dumpOrRun opts.dumpStackified (rt_is #Stackify) - (stackifyProgram closedCps) + (stackifyProgram hoistedCps) (hPutStrLn FS.stdout <=< S.encodeDataWith S.dataIso) (eval >=> fmap writeObj >>> T.unwords @@ -140,7 +148,7 @@ driver opts = do -- inspectWasm -- (\wat -> withFile opts.output FS.WriteMode \h -> hPutStrLn h wat) when opts.traceStackified do - stackifyProgram closedCps >>= traceEval + stackifyProgram hoistedCps >>= traceEval parse_e2e :: FilePath -> IO Scm.Program parse_e2e = runJalmotIO . runFileSystem . readScm diff --git a/src/Gyehoek/Options.hs b/src/Gyehoek/Options.hs index 4ecf008..eb15c2a 100644 --- a/src/Gyehoek/Options.hs +++ b/src/Gyehoek/Options.hs @@ -29,6 +29,8 @@ data Options = MkOptions , dumpCPS :: Bool , dumpParsed :: Bool , dumpStackified :: Bool + , dumpHoisted :: Bool + , dumpContified :: Bool , traceStackified :: Bool , runtime :: Maybe Runtime , inspectWasm :: Bool @@ -61,6 +63,8 @@ parser = do dumpCPS <- switch (long "dump-cps") dumpStackified <- switch (long "dump-stackified") dumpParsed <- switch (long "dump-parsed") + dumpHoisted <- switch (long "dump-hoisted") + dumpContified <- switch (long "dump-contified") traceStackified <- switch (long "trace-stackified") inspectWasm <- switch $ long "inspect-wasm" <> short 'p' runtime <- option runtimeReader . fold $ diff --git a/src/Gyehoek/Scheme/Syntax.hs b/src/Gyehoek/Scheme/Syntax.hs index 2e9ba42..49555b7 100644 --- a/src/Gyehoek/Scheme/Syntax.hs +++ b/src/Gyehoek/Scheme/Syntax.hs @@ -81,6 +81,8 @@ data Prim e | PrimZeroP e | PrimNewline | PrimMakeClosure { code :: e, env :: List e } + | PrimMakeSharedClosure { codes :: List e, env :: List e } + | PrimGetEnv | PrimEnv | PrimEnvRef Int | PrimCallCC e @@ -168,6 +170,10 @@ primDatumIso namefn a = S.match $ S.With (. ht1 "zero?") $ S.With (. ht0 "newline") $ S.With (. ht1' "make-closure") + $ S.With (. S.headTagged2 (namefn "make-shared-closure") + (S.list $ S.rest a) + (S.list $ S.rest a)) + $ S.With (. ht0 "get-env") $ S.With (. ht0 "env") $ S.With (. S.headTagged1 (namefn "env-ref") S.int) $ S.With (. ht1 "call/cc") diff --git a/stack.rnote b/stack.rnote new file mode 100644 index 0000000000000000000000000000000000000000..7efa3eefbe4fba8db330f51d330a1dc911d4be81 GIT binary patch literal 50994 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