1 Commits
Author SHA1 Message Date
msyds 6ffdf3f7e0 doc
build / build (push) Failing after 1m23s
2026-07-22 10:38:52 -06:00
6 changed files with 32 additions and 100 deletions
+1 -2
View File
@@ -66,7 +66,7 @@ library
, base ^>=4.21.2.0 , base ^>=4.21.2.0
, binary , binary
, containers , containers
, typed-process , cradle
, effectful , effectful
, effectful-core , effectful-core
, effectful-plugin , effectful-plugin
@@ -89,7 +89,6 @@ library
, text-short , text-short
, unordered-containers , unordered-containers
, vector , vector
, bytestring
hs-source-dirs: src hs-source-dirs: src
default-language: GHC2024 default-language: GHC2024
+4 -4
View File
@@ -183,10 +183,10 @@ lower' g e@(ExpApply f xs ktail) = do
(ref.cast (ref $closure)) (ref.cast (ref $closure))
(struct.get $closure $code) (struct.get $closure $code)
(return_call_ref $cont-type) (return_call_ref $cont-type)
(@gyehoek todo ;; (@gyehoek todo
(f' ##{f'}) ;; (f' ##{f'})
(ktail #{l})) ;; (ktail #{l}))
|] |]
lower' g e@(ExpContinue k xs) = do lower' g e@(ExpContinue k xs) = do
let nargs = length xs let nargs = length xs
+24 -53
View File
@@ -3,7 +3,6 @@
{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ViewPatterns #-} {-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FunctionalDependencies #-}
module Gyehoek.CPS.Syntax module Gyehoek.CPS.Syntax
( Val(..) ( Val(..)
, Kappa(..) , Kappa(..)
@@ -20,11 +19,6 @@ module Gyehoek.CPS.Syntax
, _ExpPrim , _ExpPrim
, _ExpLetRec , _ExpLetRec
, _ExpApply , _ExpApply
, binders
, body
, op
, args
, cont
, cps , cps
, pattern AbsLambda' , pattern AbsLambda'
, pattern AbsKappa' , pattern AbsKappa'
@@ -54,7 +48,6 @@ import Data.HashSet (HashSet)
import qualified Data.HashSet as HS import qualified Data.HashSet as HS
import Data.Hashable (Hashable) import Data.Hashable (Hashable)
import Data.Monoid (Endo) import Data.Monoid (Endo)
import Data.Containers.ListUtils (nubOrd)
-- Data types -- Data types
@@ -63,10 +56,10 @@ data Val
| ValLit Lit | ValLit Lit
deriving (Show, Generic, Data, Eq) deriving (Show, Generic, Data, Eq)
data Kappa = MkKappa { binders :: List Name, body :: Exp } data Kappa = MkKappa (List Name) Exp
deriving (Show, Generic, Data, Eq) deriving (Show, Generic, Data, Eq)
data Lambda = MkLambda { binders :: List Name, ktail :: Name, body :: Exp } data Lambda = MkLambda (List Name) Name Exp
deriving (Show, Generic, Data, Eq) deriving (Show, Generic, Data, Eq)
data Abs data Abs
@@ -79,7 +72,7 @@ pattern AbsLambda' xs e ktail = AbsLambda (MkLambda xs e ktail)
data Exp data Exp
= ExpPrim (Prim Val) Kappa = ExpPrim (Prim Val) Kappa
| ExpLetRec { binders :: NonEmpty (Name, Abs), body :: Exp } | ExpLetRec (NonEmpty (Name, Abs)) Exp
| ExpContinue Name (List Val) | ExpContinue Name (List Val)
| ExpIf Val Exp Exp | ExpIf Val Exp Exp
| ExpApply | ExpApply
@@ -104,24 +97,7 @@ data Program = MkProgram
deriving (Show, Generic, Data) deriving (Show, Generic, Data)
makePrisms ''Kappa makePrisms ''Kappa
-- makeLenses ''Kappa
makePrisms ''Exp makePrisms ''Exp
-- makeLenses ''Exp
-- makeFieldsNoPrefix ''Exp
-- makeFieldsNoPrefix ''Kappa
-- makeLensesWith abbreviatedFields ''Exp
-- makeLensesFor [("binders", "_binders"), ("body", "_body")] ''Exp
makeFieldsId ''Exp
makeFieldsId ''Kappa
makeFieldsId ''Lambda
instance HasBinders Abs (List Name) where
binders k (AbsKappa kap) = AbsKappa <$> binders k kap
binders k (AbsLambda lam) = AbsLambda <$> binders k lam
instance HasBody Abs Exp where
body k (AbsKappa kap) = AbsKappa <$> body k kap
body k (AbsLambda lam) = AbsLambda <$> body k lam
-- SexpIso instances -- SexpIso instances
@@ -254,29 +230,24 @@ free = go where
-- | Free variables given in the order of their appearance. -- | Free variables given in the order of their appearance.
free' :: Exp -> List Name free' :: Exp -> List Name
free' = nubOrd . goFree HS.empty where free' = go HS.empty where
gokap bound (MkKappa xs m) = go (bound & insertFrom xs) m
goFreeKap bound (MkKappa xs m) = goFree (bound & insertFrom xs) m golam bound (MkLambda xs k m) = go (bound & insertFrom (k:xs)) m
goFreeLam bound (MkLambda xs k m) = goFree (bound & insertFrom (k:xs)) m goabs bound = \case
goFreeAbs bound = \case AbsKappa kap -> gokap bound kap
AbsKappa kap -> goFreeKap bound kap AbsLambda lam -> golam bound lam
AbsLambda lam -> goFreeLam bound lam go :: HashSet Name -> Exp -> List Name
go bound = \case
goFree :: HashSet Name -> Exp -> List Name ExpPrim p k ->
goFree bound = \case p & toListOf (folded . #ValVar . filtered (`notElem` bound))
ExpPrim p k -> & (<> gokap bound k)
p & toListOf (folded . #ValVar . filtered (`notElem` bound)) ExpLetRec bs m ->
& (<> goFreeKap bound k) foldMapOf (each . _2) (goabs bound') bs <> go bound' m
ExpLetRec bs m -> where bound' = bound & insertFrom (bs ^.. each . _1)
foldMapOf (each . _2) (goFreeAbs bound') bs <> goFree bound' m ExpContinue k xs -> filter (`notElem` bound) (k : xs ^.. each . #ValVar)
where bound' = bound & insertFrom (bs ^.. each . _1) ExpIf c t f ->
ExpContinue k xs -> filter (`notElem` bound) (k : xs ^.. each . #ValVar) (c ^.. #ValVar . filtered (`notElem` bound))
ExpIf c t f -> <> go bound t <> go bound f
(c ^.. #ValVar . filtered (`notElem` bound)) ExpApply f xs k ->
<> goFree bound t <> goFree bound f (f:xs) ^.. (each . #ValVar . filtered (`notElem` bound))
ExpApply f xs k -> <> (k ^.. filtered (`notElem` bound))
(f:xs) ^.. (each . #ValVar . filtered (`notElem` bound))
<> (k ^.. filtered (`notElem` bound))
freeLambda :: Lambda -> List Name
freeLambda (MkLambda {binders,ktail,body}) = _
+2 -37
View File
@@ -16,18 +16,11 @@ import qualified Gyehoek.Sexp as Sexp
import qualified Gyehoek.Scheme.Syntax as Scm import qualified Gyehoek.Scheme.Syntax as Scm
import qualified Data.Text.Encoding as T import qualified Data.Text.Encoding as T
import System.IO (Handle) import System.IO (Handle)
import System.IO qualified as IO
import Gyehoek.CPS.Convert import Gyehoek.CPS.Convert
import Gyehoek.CPS.Lower import Gyehoek.CPS.Lower
import Gyehoek.CPS.Syntax qualified as Cps import Gyehoek.CPS.Syntax qualified as Cps
import Control.Monad import Control.Monad
import Text.Pretty.Simple (pShowNoColor) import Text.Pretty.Simple (pShowNoColor)
import System.Process.Typed
import Data.Text.Encoding (encodeUtf8)
import System.Environment.Blank (getEnvDefault)
import GHC.Conc (atomically)
import qualified Data.Text.IO as TIO
import qualified Data.ByteString.Lazy as BS
main :: IO () main :: IO ()
@@ -66,31 +59,6 @@ readScm f =
Sexp.parseSexps @Scm.CommandOrDef (fileName f) <$> hGetContents h Sexp.parseSexps @Scm.CommandOrDef (fileName f) <$> hGetContents h
>>= either error (pure . Scm.MkProgram) >>= either error (pure . Scm.MkProgram)
inspectWasm :: IOE :> es => Text -> Eff es ()
inspectWasm wat = do
pager_cmd <- liftIO $ getEnvDefault "PAGER" "less"
let wasmtools_cfg
= proc "wasm-tools" ["print", "-pf", "--print-operand-stack"
,"--color", "always", "-"]
-- & setStdin (byteStringInput . view lazy . encodeUtf8 $ wat)
-- & setStdout byteStringOutput
& setStdin createPipe
& setStdout createPipe
& setStderr inherit
let pager_cfg = proc pager_cmd []
& setStdin createPipe
& setStdout inherit
& setStderr inherit
liftIO $ withProcessWait_ wasmtools_cfg \wasmtools -> do
TIO.hPutStrLn (getStdin wasmtools) wat
IO.hFlush (getStdin wasmtools)
IO.hClose (getStdin wasmtools)
withProcessWait_ pager_cfg \pager -> do
t <- BS.hGetContents (getStdout wasmtools)
BS.hPut (getStdin pager) t
IO.hFlush (getStdin pager)
IO.hClose (getStdin pager)
driver driver
:: (GenSym :> es, FileSystem :> es, IOE :> es) :: (GenSym :> es, FileSystem :> es, IOE :> es)
=> Options -> Eff es () => Options -> Eff es ()
@@ -102,11 +70,8 @@ driver opts = do
when opts.dumpCPS do when opts.dumpCPS do
hPutStrLn FS.stdout $ Sexp.encodePretty cps ^?! _Right hPutStrLn FS.stdout $ Sexp.encodePretty cps ^?! _Right
wat <- lowerProgram cps wat <- lowerProgram cps
if not opts.inspectWasm then withFile opts.output FS.WriteMode \h ->
withFile opts.output FS.WriteMode \h -> hPutStrLn h wat
hPutStrLn h wat
else
inspectWasm wat
parse_e2e :: FilePath -> IO Scm.Program parse_e2e :: FilePath -> IO Scm.Program
parse_e2e = runEff . runFileSystem . readScm parse_e2e = runEff . runFileSystem . readScm
-3
View File
@@ -19,7 +19,6 @@ data Options = MkOptions
-- , dumpQBE :: Maybe FilePath -- , dumpQBE :: Maybe FilePath
dumpCPS :: Bool dumpCPS :: Bool
, dumpParsed :: Bool , dumpParsed :: Bool
, inspectWasm :: Bool
, output :: FilePath , output :: FilePath
, sourceFile :: FilePath , sourceFile :: FilePath
} }
@@ -50,12 +49,10 @@ parseOutput = strOption
parseDumpCPS = switch (long "dump-cps") parseDumpCPS = switch (long "dump-cps")
parseDumpParsed = switch (long "dump-parsed") parseDumpParsed = switch (long "dump-parsed")
parseInspectWasm = switch $ long "inspect-wasm" <> short 'p'
parser :: Parser Options parser :: Parser Options
parser = MkOptions parser = MkOptions
<$> parseDumpCPS <$> parseDumpCPS
<*> parseDumpParsed <*> parseDumpParsed
<*> parseInspectWasm
<*> parseOutput <*> parseOutput
<*> argument str (metavar "FILE") <*> argument str (metavar "FILE")
+1 -1
View File
@@ -52,7 +52,7 @@ import Language.Haskell.TH.Quote (QuasiQuoter)
newtype Name = MkName { inner :: Text } newtype Name = MkName { inner :: Text }
deriving newtype (Show, Eq, Ord, IsString, Gen, Hashable) deriving newtype (Show, Eq, IsString, Gen, Hashable)
deriving stock (Generic, Data) deriving stock (Generic, Data)
getName :: Name -> Text getName :: Name -> Text