mirror of
https://github.com/anoma/juvix.git
synced 2025-01-08 16:51:53 +03:00
be24abb0ca
This PR adds a `anoma` target to the `juvix compile`. This target compiles a Juvix `main` function to a Nockma/Anoma "function". Unlike the native, wasm, and nockma targets the main function may have any type signature. ## Anoma calling convention [Anoma calls functions](6a4e15fe9c/lib/anoma/resource.ex (L122)
) by evaluating the formula `[call L replace [RL args] @ S]` against a subject equal to the function. Here `args` is a Nockma term that evaluates to a tuple of arguments that should be passed to the function. The anoma target compiles the `main` function to Nockma in the same way as the nockma target. The main function is then [wrapped](9a658465ae/src/Juvix/Compiler/Nockma/Translation/FromTree.hs (L627)
) to make it compatible with the Anoma calling convention. ## Testing The anoma calling convention is [unit tested](9a658465ae/test/Nockma/Eval/Positive.hs (L117)
) and [smoke tested](9a658465ae/tests/smoke/Commands/compile.smoke.yaml (L159)
). This PR also adds versions of the end-to-end compilation tests. Most tests are included, tests for builtin IO operations and string builtins are omitted. Other tests that use Strings have been adapted to use other types that are compatible with this backend. ## Nockma REPL To facilitate testing the Nockma REPL can now load a nockma file as an initial subject. --------- Co-authored-by: Lukasz Czajka <lukasz@heliax.dev>
43 lines
1.8 KiB
Haskell
43 lines
1.8 KiB
Haskell
module Commands.Compile where
|
|
|
|
import Commands.Base
|
|
import Commands.Compile.Options
|
|
import Commands.Dev.Core.Compile.Base qualified as Compile
|
|
import Commands.Extra.Compile qualified as Compile
|
|
import Juvix.Compiler.Core qualified as Core
|
|
import Juvix.Compiler.Core.Pretty qualified as Core
|
|
import Juvix.Compiler.Core.Transformation.DisambiguateNames qualified as Core
|
|
|
|
runCommand :: (Members '[EmbedIO, App, TaggedLock] r) => CompileOptions -> Sem r ()
|
|
runCommand opts@CompileOptions {..} = do
|
|
inputFile <- getMainFile _compileInputFile
|
|
Core.CoreResult {..} <- runPipeline (AppPath (preFileFromAbs inputFile) True) upToCore
|
|
let arg =
|
|
Compile.PipelineArg
|
|
{ _pipelineArgFile = inputFile,
|
|
_pipelineArgOptions = opts,
|
|
_pipelineArgModule = _coreResultModule
|
|
}
|
|
case _compileTarget of
|
|
TargetNative64 -> Compile.runCPipeline arg
|
|
TargetWasm32Wasi -> Compile.runCPipeline arg
|
|
TargetGeb -> Compile.runGebPipeline arg
|
|
TargetVampIR -> Compile.runVampIRPipeline arg
|
|
TargetCore -> writeCoreFile arg
|
|
TargetTree -> Compile.runTreePipeline arg
|
|
TargetAsm -> Compile.runAsmPipeline arg
|
|
TargetReg -> Compile.runRegPipeline arg
|
|
TargetNockma -> Compile.runNockmaPipeline arg
|
|
TargetAnoma -> Compile.runAnomaPipeline arg
|
|
|
|
writeCoreFile :: (Members '[EmbedIO, App, TaggedLock] r) => Compile.PipelineArg -> Sem r ()
|
|
writeCoreFile pa@Compile.PipelineArg {..} = do
|
|
entryPoint <- Compile.getEntry pa
|
|
coreFile <- Compile.outputFile _pipelineArgOptions _pipelineArgFile
|
|
r <- runReader entryPoint . runError @JuvixError $ Core.toStored _pipelineArgModule
|
|
case r of
|
|
Left e -> exitJuvixError e
|
|
Right md -> do
|
|
let txt = show (Core.ppOutDefault (Core.disambiguateNames md ^. Core.moduleInfoTable))
|
|
writeFileEnsureLn coreFile txt
|