Skip to content
🌸 a simple scripting language (alpha) 🌸
Branch: haru
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples
src
tests
vscode-extension
.gdbinit
.gitignore deny nul character in string literals Jun 1, 2019
.travis.yml
Cargo.lock
Cargo.toml
DOCUMENTATION.md
LICENSE
README.md
build.rs run cargo fmt May 26, 2019
rust-toolchain
rustfmt.toml

README.md

🌸 hana

travis codecov Gitter

hana is a small dynamically-typed scripting language written in Rust/C and is inspired by Pascal, Ruby and Javascript. It primarily supports prototype-based object orientation, dynamic arrays, first-class functions (with closure support). The interpreter comes useful features such as a simple mark-and-sweep garbage collector, exception handling and an import system.

haru, the Rust parser/runtime generates bytecode that runs on an optimised virtual machine written in C (about as fast as Python and Ruby!)

Installation

You'll need to have the cargo package manager and rust installed. You can then do:

cargo install haru

The interpreter called haru will be installed into your PATH.

Additional features

Additional features can be enabled by passing their names into cargo's --features flag:

  • jemalloc: use the jemalloc memory allocator
  • cffi: enables the stdlib's C foreign interface (wip)

Running

Once built or installed, you can write hana code into a source file, then invoke the interpreter like this:

haru program.hana

Alternatively you could invoke a REPL for easier prototyping:

haru

For usage, pass the -h command:

usage: haru [options] [-c cmd | file | -]
options:
 -c cmd : execute program passed in as string
 -d/--dump-vmcode: dumps vm bytecode to stdout
                   (only works in interpreter mode)
 -b/--bytecode: runs file as bytecode
 -a/--print-ast: prints ast and without run
 -v/--version: version

Examples

see /examples for more

Hello World

print("Hello World\n")

Variables

name = "Alice"
age = 20
print(name, " is ", age, " years old.\n")

Fibonacci numbers

// Regular recursive
fib(n) = n <= 1 ? 1 : fib(n-1) + fib(n-2)
print(fib(30), "\n")

// Faster recursive (with tail-call optimization!)
fibrec(n, prev, curr) = n <= 0 ? curr : fibrec(n-1, prev+curr, prev)
fib(n) = fibrec(n+1, 1, 0)
print(fib(50), "\n")

Documentation

see DOCUMENTATION.md

Building

(building was tested by using rust-nightly and gcc-4.8 on an x64 with Linux, mileage may vary on other architectures)

Just do:

cargo build --release

License

GPLv3 License

You can’t perform that action at this time.