Janet is a functional and imperative programming language. It runs on Windows, Linux, macOS, BSDs, and should run on other systems with some porting. The entire language (core library, interpreter, compiler, assembler, PEG) is less than 1MB. You can also add Janet scripting to an application by embedding a single C file and two headers.

Community

Feel free to ask questions and join discussion on the Janet Gitter Channel. Alternatively, check out the #janet channel on Freenode. For help, you can also checkout Janet Docs for Janet documentation with user-provided examples.

Other Gitter Rooms

help: For getting help withi specific problems in the Janet language.

website: For discussion and help related to this website and documentation.

Use Cases

Janet makes a good system scripting language, or a language to embed in other programs. Think Lua or Guile. Janet also can be used for rapid prototyping, dynamic systems, and other domains where dynamic languages shine. Implemented mostly in standard C99, Janet runs on Windows, Linux and macOS. The few features that are not standard C (dynamic library loading, compiler specific optimizations), are fairly straightforward. Janet can be easily ported to new platforms.

Features

Minimal setup - one binary and you are good to go!

First class closures

Garbage collection

First class green threads (continuations)

Python style generators (implemented as a plain macro)

Mutable and immutable arrays (array/tuple)

Mutable and immutable hashtables (table/struct)

Mutable and immutable strings (buffer/string)

Macros

Byte code interpreter with an assembly interface, as well as bytecode verification

Tail call optimization

Direct interop with C via abstract types and C functions

Dynamically load C libraries

Functional and imperative standard library

Lexical scoping

Imperative and functional programming

REPL

Parsing Expression Grammars built in to the core library

300+ functions and macros in the core library

Interactive environment with detailed stack traces

Export your projects to standalone executables with a companion build tool, jpm

Try It

> (print "hello, world!")

Usage

A REPL is launched when the janet binary is invoked with no arguments. Pass the -h flag to display the usage information. Individual scripts can be run with janet myscript.janet

If you are looking to explore, you can print a list of all available macros, functions, and constants by entering the command all-bindings into the REPL.

$ janet Janet 1.0.0-dev-cc1ff91 Copyright (C) 2017-2019 Calvin Rose janet:0:> (+ 1 2 3) 6 janet:10:> (print "Hello, world!") Hello, world! nil janet:34:> (os/exit) $ janet -h usage: janet [options] script args... Options are: -h : Show this help -v : Print the version string -s : Use raw stdin instead of getline like functionality -e code : Execute a string of janet -r : Enter the repl after running all scripts -p : Keep on executing if there is a top level error (persistent) -q : Hide prompt, logo, and repl output (quiet) -k : Compile scripts but do not execute -m syspath : Set system path for loading global modules -c source output : Compile janet source code into an image -n : Disable ANSI color output in the repl -l path : Execute code in a file before running the main script -- : Stop handling options

Modules and Libraries

See some auxiliary projects on GitHub. Here is a short list of libraries for Janet to help you get started with some interesting stuff. See the Janet Package Listing for a more complete list. Packages in the listing can be installed via jpm install pkg-name .

Circlet - An HTTP server for Janet

Joy Web Framework - Framework for web development in Janet

JSON - A JSON parser and encoder

SQLite3 - Bindings to SQLite

WebView - Spawn a browser window for creating HTML+CSS UIs on any platform

Jaylib - Bindings to Raylib for 2d and 3d game development

JHydro - Cryptography for Janet

JanetUI - Bindings to libui

For editor support: