can't do this! killing myself tonight ‼️ here's three lines of code i spent four hours on
This commit is contained in:
63
src/Core.hs
63
src/Core.hs
@@ -1,14 +1,67 @@
|
||||
{-# LANGUAGE PatternSynonyms #-}
|
||||
module Core where
|
||||
----------------------------------------------------------------------------------
|
||||
import Data.Coerce
|
||||
----------------------------------------------------------------------------------
|
||||
|
||||
data Expr = Let Rec [Binding] Expr
|
||||
| Case Expr [Alt]
|
||||
data Expr = Var Name
|
||||
| Con Int Int
|
||||
| Let Rec [Binding] Expr
|
||||
| Case Expr [Alter]
|
||||
| Lam [Name] Expr
|
||||
| App Expr Expr
|
||||
| IntP Int
|
||||
|
||||
data Binding
|
||||
infixl 2 :$
|
||||
pattern (:$) :: Expr -> Expr -> Expr
|
||||
pattern f :$ x = App f x
|
||||
|
||||
data Rec
|
||||
data Binding = Binding Name Expr
|
||||
|
||||
data Alt
|
||||
infixl 1 :=
|
||||
pattern (:=) :: Name -> Expr -> Binding
|
||||
pattern k := v = Binding k v
|
||||
|
||||
data Rec = Rec
|
||||
| NonRec
|
||||
|
||||
data Alter = Alter Int [Name] Expr
|
||||
|
||||
type Name = String
|
||||
|
||||
data ScDef = ScDef Name [Name] Expr
|
||||
|
||||
newtype Program = Program [ScDef]
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
|
||||
instance Semigroup Program where
|
||||
(<>) = coerce $ (++) @ScDef
|
||||
|
||||
instance Monoid Program where
|
||||
mempty = Program []
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
|
||||
bindersOf :: [(Name, b)] -> [Name]
|
||||
bindersOf = fmap fst
|
||||
|
||||
rhssOf :: [(Name, b)] -> [b]
|
||||
rhssOf = fmap snd
|
||||
|
||||
isAtomic :: Expr -> Bool
|
||||
isAtomic (Var _) = True
|
||||
isAtomic _ = False
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
|
||||
corePrelude :: Program
|
||||
corePrelude = Program
|
||||
[ ScDef "id" ["x"] (Var "x")
|
||||
, ScDef "K" ["x", "y"] (Var "x")
|
||||
, ScDef "K1" ["x", "y"] (Var "y")
|
||||
, ScDef "S" ["f", "g", "x"] (Var "f" :$ Var "x" :$ (Var "g" :$ Var "x"))
|
||||
, ScDef "compose" ["f", "g", "x"] (Var "f" :$ (Var "g" :$ Var "x"))
|
||||
, ScDef "twice" ["f", "g", "x"] (Var "f" :$ (Var "g" :$ Var "x"))
|
||||
]
|
||||
|
||||
|
||||
54
src/TI.hs
Normal file
54
src/TI.hs
Normal file
@@ -0,0 +1,54 @@
|
||||
module TI where
|
||||
----------------------------------------------------------------------------------
|
||||
import Data.Map (Map, (!?), (!))
|
||||
import qualified Data.Map as M
|
||||
import Data.Set (Set)
|
||||
import qualified Data.Set as S
|
||||
import Data.Maybe (fromJust)
|
||||
import Data.List (mapAccumL)
|
||||
import Core
|
||||
----------------------------------------------------------------------------------
|
||||
|
||||
data TiState = TiState [Addr] Dump Heap [(Name, Addr)] Stats
|
||||
|
||||
type Heap = Set Node
|
||||
|
||||
data Node = NAp Addr Addr
|
||||
| NSupercomb Name [Name] Expr
|
||||
| NNum Int
|
||||
|
||||
data Dump = DumpTempDummy
|
||||
|
||||
type Stats = Int
|
||||
|
||||
type Addr = Int
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
|
||||
tiStatIncSteps :: Stats -> Stats
|
||||
tiStatIncSteps = (+1)
|
||||
|
||||
tiStatGetSteps :: Stats -> Int
|
||||
tiStatGetSteps = id
|
||||
|
||||
----------------------------------------------------------------------------------
|
||||
|
||||
compile :: Program -> Maybe TiState
|
||||
compile prog = Just $ TiState s d h g stats
|
||||
where
|
||||
s = [mainAddr]
|
||||
d = DumpTempDummy
|
||||
(h,g) = buildInitialHeap defs
|
||||
defs = prog <> corePrelude
|
||||
stats = undefined
|
||||
|
||||
mainAddr = fromJust $ lookup "main" g
|
||||
|
||||
buildInitialHeap :: Program -> (Heap, [(Name, Addr)])
|
||||
buildInitialHeap = undefined
|
||||
|
||||
-- buildInitialHeap (Program scdefs) = mapAccumL allocateSc mempty scdefs
|
||||
-- where
|
||||
-- allocateSc :: Heap -> ScDef -> (Heap, (Name, Addr))
|
||||
-- allocateSc = undefined
|
||||
|
||||
Reference in New Issue
Block a user