Skip to content

Commit

Permalink
Add internal core-eval option to evaluate named function identifier (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
paulcadman authored Feb 8, 2023
1 parent e0b5ac9 commit e0337c1
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 2 deletions.
19 changes: 18 additions & 1 deletion app/Commands/Dev/Internal/CoreEval.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,31 @@ module Commands.Dev.Internal.CoreEval where

import Commands.Base
import Commands.Dev.Internal.CoreEval.Options
import Data.HashMap.Internal.Strict (elems)
import Data.HashMap.Strict qualified as HashMap
import Evaluator
import Juvix.Compiler.Core.Data.InfoTable
import Juvix.Compiler.Core.Language.Base
import Juvix.Compiler.Core.Transformation qualified as Core
import Juvix.Compiler.Core.Translation
import Safe (headMay)

getSymbol :: forall r. Member App r => InfoTable -> Text -> Sem r Symbol
getSymbol tab name = maybe failAction (return . (^. identifierSymbol)) mIdent
where
identifiers :: [IdentifierInfo]
identifiers = elems (tab ^. infoIdentifiers)

mIdent :: Maybe IdentifierInfo
mIdent = headMay (filter ((== name) . (^. identifierName)) identifiers)

failAction :: Sem r a
failAction = exitMsg (ExitFailure 1) (name <> " is not a function identifier")

runCommand :: (Members '[Embed IO, App] r) => InternalCoreEvalOptions -> Sem r ()
runCommand localOpts = do
tab <- (^. coreResultTable) <$> runPipeline (localOpts ^. internalCoreEvalInputFile) upToCore
let tab' = Core.applyTransformations (project localOpts ^. internalCoreEvalTransformations) tab
forM_ ((tab' ^. infoMain) >>= ((tab' ^. identContext) HashMap.!?)) (evalAndPrint localOpts tab')
ms <- mapM (getSymbol tab') (localOpts ^. internalCoreEvalSymbolName)
let symbol = ms <|> (tab' ^. infoMain)
forM_ (symbol >>= ((tab' ^. identContext) HashMap.!?)) (evalAndPrint localOpts tab')
11 changes: 10 additions & 1 deletion app/Commands/Dev/Internal/CoreEval/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ data InternalCoreEvalOptions = InternalCoreEvalOptions
{ _internalCoreEvalTransformations :: [TransformationId],
_internalCoreEvalShowDeBruijn :: Bool,
_internalCoreEvalNoIO :: Bool,
_internalCoreEvalInputFile :: AppPath File
_internalCoreEvalInputFile :: AppPath File,
_internalCoreEvalSymbolName :: Maybe Text
}
deriving stock (Data)

Expand Down Expand Up @@ -42,4 +43,12 @@ parseInternalCoreEval = do
<> help "Don't interpret the IO effects"
)
_internalCoreEvalInputFile <- parseInputJuvixFile
_internalCoreEvalSymbolName <-
optional $
strOption
( long "symbol-name"
<> short 's'
<> help "Evaluate a function identifier (default: main)"
<> metavar "NAME"
)
pure InternalCoreEvalOptions {..}
3 changes: 3 additions & 0 deletions tests/positive/Internal/LiteralInt.juvix
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ module LiteralInt;

f : Nat;
f := 1;

main : IO;
main := printNatLn 2;
end;
40 changes: 40 additions & 0 deletions tests/smoke/Commands/dev/internal.smoke.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,43 @@ tests:
matches: |-
(.+)\/([^\/]+)\.juvix\:[0-9]*\:[0-9]*\-[0-9]*\: error
exit-status: 1

- name: internal-core-eval
command:
- juvix
- dev
- internal
- core-eval
args:
- positive/Internal/LiteralInt.juvix
stdout: |
suc (suc zero)
exit-status: 0

- name: internal-core-eval-transform
command:
- juvix
- dev
- internal
- core-eval
- --transforms
- nat-to-int
args:
- positive/Internal/LiteralInt.juvix
stdout: |
2
exit-status: 0

- name: internal-core-eval-symbol-name
command:
- juvix
- dev
- internal
- core-eval
- --symbol-name
- f
args:
- positive/Internal/LiteralInt.juvix
stdout: |
suc zero
exit-status: 0

0 comments on commit e0337c1

Please sign in to comment.