38 releases (9 breaking)

0.29.5 Jun 13, 2019
0.28.0 Jun 8, 2019

#7 in #hana

Download history 28/week @ 2024-07-20 243/week @ 2024-07-27 4/week @ 2024-09-21

99 downloads per month

GPL-3.0 license

270KB
7K SLoC

Rust 5.5K SLoC // 0.1% comments C 1K SLoC // 0.1% comments

🌸 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

Dependencies

~6.5–9MB
~172K SLoC