This repository contains the implementation of efci, a Curry interpreter
based on effects and handlers.
git clone https://github.com/nbun/efci
cd efci
git submodules pull --init
stack install
Run
efci [filename]
from the directory where filename.curry is located. If efci is called without an argument, only the Prelude module is loaded.
If you have rlwrap installed, use rlwrap efci [filename] to get an input history for the interpreter.
- Without an option, the input is interpreted as a Curry expression within the loaded file.
:qexits interpreter.:orotates between the available interpretation modes:timetoggles printing time elapsed during interpretation:fcytoggles printing of themainexpression generated from the input.
stack test effective-curry-interpreter
stack bench effective-curry-interpreter
stack haddock --open effective-curry-interpreter
- src: implementation of the interpreter(s)
- Data.Union: open unions used for implementing signatures
- Effect: implementations of (Curry-specific) effects
- FlatCurry: Curry-specific effects
- Constructor: terms and pattern matching effect
- Declarations: function declaration effect
- Function: Partial application effect
- IO: input/output effect
- Let: local bindings effect
- General: commonly known effects
- Error: (unexpected) error effect
- Memoization: lazy evaluation effect
- ND: non-determinism effect
- State: state effect
- Transformation: transformation functions
- App: REPL logic and front end integration
- Debug: flags for toggling debug output
- Forwarding: forwarding functions and carrier classes
- Free: effect representations (tree-based, continuation-based, smart views)
- InterpFL: implementation of A Monadic Semantics for Core Curry
- Pipeline: pipelines for different effect representations
- Signature: adapters, type operators, and injection functions for signatures
- Type: auxiliary functions and type definitions
- FlatCurry: Curry-specific effects
- tests/Main.hs: test suite runner
- examples: example programs for the test suite
- benchmarks: benchmark programs
- Main.hs: benchmark runner
- Ambiguous types are not defaulted. For example,
1 + 2needs to be annotated as1 + 2 :: Int. - Not all external functions are implemented.
Haskell'24 paper Making a Curry Interpreter using Effects and Handlers: