WARNING: This project is highly experimental and has an unstable development schedule
Lemni is a functional programming language I created for the hell of it. It is designed with the intent of being referentially transparent while still being able to use (some) procedural techniques.
Included is a library for lexing, parsing, evaluating and compiling lemni source code. It has a C11 API with C++20 wrappers. It is implemented in C++20.
For an example of lexing and parsing take a look at testall/main.cpp
.
- ICU4C
- GNU MP
- GNU MPFR
- ArbLib
- libffi
- LLVM 10
sudo apt --no-install-suggests --no-install-recommends install \
g++ make cmake-data cmake\
libgmp-dev libmpfr-dev libflint-dev libflint-arb-dev \
libicu-dev libffi-dev llvm-10-runtime llvm-10-dev
Taking for granted a bash-like shell, from the source dir run the following:
git submodule update --init --recursive
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
cmake --build . -- -j4
A REPL is included to test out the language quickly.
Follow the instructions under Library
Command: lemni-repl [options]
Here options
can be one or more of the following:
Option | Description |
---|---|
-i filename |
Evaluate a file before prompting for user input |
-e "expr" |
Evaluate an expression and print the result |
If run without any options you should get a blank interpreter instance to play around with.
To start the REPL from the build directory, run the following command:
./repl/lemni-repl
You should be met with a prompt like so:
Lemni lang REPL v6.9 rev 420
Enter Repl.help () for help, or Repl.quit () to quit
>
To get a feel for the language, try calling Repl.tut ()
.
import IO
import Chars
prompt(msg) =
IO.out msg
IO.in ()
capitalize(name) =
(Chars.toUpper (head name)) ++ (tail name)
stripWs(name) =
if Chars.isSpace (head name) then
stripWs (tail name)
elif Chars.isSpace (last name) then
stripWs (init name)
else
name
main() =
name = (capitalize . stripWs)
(prompt "What's your name? ")
IO.outln ("Hello, " ++ name ++ "!")
Thank you to all the developers behind the following open-source projects that made this possible: