Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add internal core-eval option to evaluate named function identifier #1819

Merged
merged 1 commit into from
Feb 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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