Compare commits
1
Commits
idk
..
6ffdf3f7e0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ffdf3f7e0 |
+1
-2
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user