Allow _ in Wasm exported names
The Anoma validity predicate Wasm signature is:
"_validate_tx": [I64, I64, I64, I64, I64, I64, I64, I64] -> [I64]
So we need to allow exported names containing '_'.
This PR adds a Juvix module that exports a function with this signature
and a test that the resulting Wasm function can be called.
* Add a Web version of TicTacToe
The web version demonstrates injecting host functions into the WASM
import table and call exported Juvix functions from JS.
The web version and the CLI version of the TicTacToe game use the same
game logic backend Juvix module.
* Build and publish web apps in documentation
* Add a link to the TicTacToe web app in example documentation
* Update Makefile to match the new format
* import all non-compile axioms with alphanum names in entrypoint
This commit adds `__attribute__((input_name(<name>)))` to the type
signature of all axioms that do not have a compile block. This indicates
to the compiler that this function should be added to the input table of
the WASM binary.
Adds a test that an imported function can be called from Juvix.
* test: Run node command in same directory as WASM output
* Don't generate importName for non-alphnum axioms
* Add a tutorial on Juvix module to JS interop via Wasm
* Export all functions with alphanum names in entrypoint
Set the export_name attribute on every function signature that has a
fully alpha numeric name.
* Adds a non-WASI target to compile command
WASM libraries we want to run in the browser and in Anoma VM do not have
access to the WASI runtime. For this usecase we need a target runtime
that does not use the WASI runtime.
A `wasi-` prefix is added to existing compile targets and introduce a new
standalone target. This target does not have IO functions like
`putStrLn` and `exit` calls `__builtin_trap` which corresponds to the
`unreachable` WASM instruction.
In the non-exhaustive case error a debug message is emitted to tell the
user which function had the error. This is now abstracted to a `debug`
function in the runtime which calls `putStrLn` in the case of WASI and
is no-op in the case of non-WASI.
Tests are added which check that exported names can be called with the
correct name and result.
* Moves walloc to a common directory
An axiom without a compile block generates a C function signature
without a corresponding body. This allows implementations to be injected
at link time (JS, Anoma).
* Update SimpleFungibleToken to use stdlib
We do not want to put an Int type into the standard library before we
have builtin support for arbitrary precision integers. So we include the
Int type locally in the project for now.
* Update reference to stdlib
* Fix shell-tests for SimpleFungibleToken
* Compute name dependency graph and filter unreachable declarations
* bugfix: recurse into type signatures
* positive tests
* make ormolu happy
* get starting nodes from ExportInfo
* make ormolu happy
* cosmetic refactoring of DependencyInfo
* fix tests & style
* add a simple positive test
* add lambda expressions to microjuvix language
* add basic normalization of type aliases
* fix test name
* normalize only functions on types
* normalize when matching
* fix type of inductive names
* improve detection of normalizing functions
* remove obsolete comment
* match constructor return type
* add test for issue 1333
* fix existing tests
* use lambda case
* add strong normalization
* Add test cases for type aliases and another fix
Co-authored-by: Jonathan Cubides <jonathan.cubides@uib.no>
* w.i.p
* Added strict positivity condition for datatypes w.i.p
* Add negative test for str.postivity check
* Add some revisions
* the branch is back to feet
* w.i.p add lots of traces to check alg.
* Add more test and revisions
* Add negative and positive test to the new flag and the keyword
* Fix shell tests.
* Make pre-commit happy
* Fix rebase conflicts
* Make pre-commit happy
* Add shell test, rename keyword, fix error msg
* Revert change
* Necessary changes
* Remove wrong unless
* Move the positivity checker to its own folder
* Add missing juvix.yaml
* Add a negative test thanks to jan
* make some style changes
* Make ormolu happy
* Remove unnecessary instance of Show
Co-authored-by: Jan Mas Rovira <janmasrovira@gmail.com>
* keep qualified names
* add comment
* add pretty field to Abstract Name
* add test
* Add shell test
* Add another test
* fix shell test
Co-authored-by: Jonathan Cubides <jonathan.cubides@uib.no>
* Implement error message for double braces
* Implement error message for implicit pattern on the left of an application
* Implement error message for constructor expected on the left of an application
Co-authored-by: Jan Mas Rovira <janmasrovira@gmail.com>
* Renaming MiniJuvix to Juvix
* Make Ormolu happy
* Make Hlint happy
* Remove redundant imports
* Fix shell tests and add target ci to our Makefile
* Make pre-commit happy
* Throw error when reading a file that conflicts with stdlib
The Files effect first tries to read a file from the embedded stdlib. If
this succeeds and the file also exists in the project then an error is
thrown.
This error can be thrown either at the parsing stage, if the entrypoint
file conflicts with the standard library, or at the scoping stage if an
imported file conflicts.
* Fix module name in test file
* improve and add Universe to MicroJuvix expressions
* continue with the refactor
* refactor typechecker and aritychecker
* refactor Abstract to Micro
* format
* refactor type calls builder and monojuvix translation
* complete abstract translation
* traversals have betrayed me
* fix monomorphisation and traversals
* update tests
* format
* rename Function2
* remove obsolete comments
* fix comment
This commit introduces a cache of Abstract.TopModule that is queried for
each ImportStatement.
Before this change, `registerBuiltin` could be called multiple times for
a module, if it was imported multiple times.
* Embed stdlib in minijuvix library
We add a new step at the beginning of the pipeline called Setup that
registers the modules in the standard library with the Files effect. The
standard library is then used when the Scoper queries the Files effect
for modules as it resolves import statements.
Use of the standard library can be disabled using the global
`--no-stdlib` command-line option.
* CI: Checkout submodules recursively for stdlib
* Add a new `--no-stdlib` option to shell check
* Poke CI
* CI: Checkout submodules in the test job
* match inductive definitions
* progress towards builtins
* more progress towards builtin types
* add more builtins
* add some errors
* add reverse table to builtins
* Squashed commit of the following:
commit 93333de502d8dd546eb8edf697ca7eef972ea105
Author: Paul Cadman <git@paulcadman.dev>
Date: Mon Jun 27 18:21:30 2022 +0100
Use builtin names for match and project functions
Add an implementation of nat for the standalone backend
commit 868d2098ee57b7acbca84512b6e096650eeeb22d
Author: Jan Mas Rovira <janmasrovira@gmail.com>
Date: Mon Jun 27 18:15:29 2022 +0200
add builtin information to ClosureInfo
commit 32c78aceb19ee4010d66090a3c4e6025621b5c1f
Author: Paul Cadman <git@paulcadman.dev>
Date: Mon Jun 27 12:52:10 2022 +0100
Refactor BuiltinEnum to sum type of each Builtin
commit 55bb72ab12a8fb7d10070c2dee5875482453b7c6
Author: Paul Cadman <git@paulcadman.dev>
Date: Fri Jun 24 14:44:28 2022 +0100
Add Builtin information to Mono InfoTable
commit a72368f2e3af20baaf44c5e21fa7e6a469cf1ac5
Author: Paul Cadman <git@paulcadman.dev>
Date: Fri Jun 24 14:41:51 2022 +0100
Add Bitraversable to Prelude
commit afa3153d82a9509b0882e7ca99830040fad9ef65
Author: Paul Cadman <git@paulcadman.dev>
Date: Fri Jun 24 14:41:39 2022 +0100
Remove unused import
commit ea0b7848fb80970e03a0561be3fb4448486a89a9
Author: Paul Cadman <git@paulcadman.dev>
Date: Thu Jun 23 13:54:58 2022 +0100
Use projection functions instead of direct member access
* Avoid shadowing C runtime names in foreign block
* Fix formatting
* Update C names for builtin functions
* Add prim_ prefix to builtin C names
Implement builtins for standalone and libc backends
* Update ormolu action
* ci: run all tests for draft PRs
Co-authored-by: Paul Cadman <git@paulcadman.dev>
* Add support for parital application eval/apply
* include string.h in libc runtime
* Add wasm SimpleFungibleTokenImplicit to tests
* Update VP example to new syntax
* propagate types from all reachable modules
* Change prelude import ordering to workaround minic issue
* Pre-declare inductive typedefs in C backend
This generates the typedefs corresponding to each inductive type.
e.g
```
inductive Bool { .. }
```
is translated to:
```
typedef struct Bool_3_s Bool_3_t;
```
This means that C code can reference these typedefs before they have
been fully defined. (all references to inductive types go through these typedefs
names).
This fixes an issue with the ordering of delcarations when modules are included.
* Use common Lib for MiniC tests
* libc runtime: flush stdout after writing to it
* Adds MiniTicTacToe example using common example lib
In MonoJuvixToMiniC we emit the inductive type typedefs before anything
else to support includes ordering
* Adds tests for mutually recrusive functions
* Add golden tests for milestone examples
* Example: Remove commented out code
* Test error handling behaviour in MiniTicTacToe
* Fail clang compilation on warnings
* Add test for Nested list types
* Add PrettyCode instances for NonEmpty and ConcreteType
* Ignore IsImplicit field in Eq and Hashable of TypeApplication
This is to workaround a crash in Micro->Mono translation when looking up
a concrete type
* Fix formatting
* hlint fixes
* Formatting fixes not reported by local pre-commit
* Refactor MonoJuvixToMiniC
* Fix shelltest
NB: We cannot check the order of the 'Writing' lines because this
depends on the order of files returned by the FS which is
non-deterministic between systems
* Refactor Base to CBuilder
* Refactor using applyOnFunStatement
Co-authored-by: Jan Mas Rovira <janmasrovira@gmail.com>