40 lines
1.6 KiB
Haskell
40 lines
1.6 KiB
Haskell
{-# LANGUAGE Trustworthy #-} -- uses vector operations
|
|
{-# LANGUAGE OverloadedRecordDot #-}
|
|
module Language.Scalie.Compiler.Bytecode (EntryPoint, compile, CompilationError(..)) where
|
|
import Language.Scalie.Core.Module (Module (definitions))
|
|
import Data.Text (Text)
|
|
import Language.Scalie.Core.Provenance (Provenance (value, Provenance, source))
|
|
import Language.Scalie.Core.Provenance.SourceLocation (SourceLocation)
|
|
import Language.Scalie.Bytecode.Object qualified as Bytecode
|
|
import Data.Kind (Type)
|
|
import Data.Either (Either (Left, Right))
|
|
import Data.Vector qualified as Vector
|
|
import Control.Category ((.))
|
|
import Data.Function (($))
|
|
import Data.Functor ((<$>))
|
|
import Data.Map.Implicit qualified as ImplicitMap
|
|
import Data.Maybe (Maybe(Nothing, Just))
|
|
import Language.Scalie.Core.Definition (Definition(body, name))
|
|
import Language.Scalie.Core.Expression (Expression(RawInt))
|
|
import Language.Scalie.Bytecode.Instruction qualified as Instruction
|
|
import Prelude (undefined)
|
|
|
|
-- | The name of the entrypoint function
|
|
|
|
type EntryPoint :: Type
|
|
type EntryPoint = Text
|
|
|
|
type CompilationError :: Type
|
|
newtype CompilationError = NameNotFound Text
|
|
|
|
compile :: Module (Provenance SourceLocation) -> EntryPoint -> Either CompilationError Bytecode.Object
|
|
compile mod entry = undefined
|
|
{- let
|
|
topLevelDefinitions = mod.definitions.value
|
|
in Bytecode.Object . Vector.fromList <$> case ImplicitMap.lookup entry topLevelDefinitions of
|
|
Nothing -> Left $ NameNotFound entry
|
|
Just def -> Right
|
|
[ (\(RawInt i) -> Instruction.PushInteger i) <$> def.body
|
|
, Provenance def.name.source (Instruction.ReturnValues 1)
|
|
]
|
|
-}
|