2019-02-02 07:30:15 +00:00
[![Join the chat ](https://badges.gitter.im/janet-language/community.svg )](https://gitter.im/janet-language/community)
2019-02-18 02:22:03 +00:00
[![Appveyor Status ](https://ci.appveyor.com/api/projects/status/bjraxrxexmt3sxyv/branch/master?svg=true )](https://ci.appveyor.com/project/bakpakin/janet/branch/master)
2018-12-25 20:45:18 +00:00
[![Build Status ](https://travis-ci.org/janet-lang/janet.svg?branch=master )](https://travis-ci.org/janet-lang/janet)
2020-08-08 00:48:06 +00:00
[![builds.sr.ht status ](https://builds.sr.ht/~bakpakin/janet/commits/freebsd.yml.svg )](https://builds.sr.ht/~bakpakin/janet/commits/freebsd.yml?)
[![builds.sr.ht status ](https://builds.sr.ht/~bakpakin/janet/commits/openbsd.yml.svg )](https://builds.sr.ht/~bakpakin/janet/commits/openbsd.yml?)
[![builds.sr.ht status ](https://builds.sr.ht/~bakpakin/janet/commits/meson.yml.svg )](https://builds.sr.ht/~bakpakin/janet/commits/meson.yml?)
[![builds.sr.ht status ](https://builds.sr.ht/~bakpakin/janet/commits/meson_min.yml.svg )](https://builds.sr.ht/~bakpakin/janet/commits/meson_min.yml?)
2017-06-25 23:56:17 +00:00
2018-12-29 18:13:57 +00:00
< img src = "https://raw.githubusercontent.com/janet-lang/janet/master/assets/janet-w200.png" alt = "Janet logo" width = 200 align = "left" >
2018-12-11 23:06:10 +00:00
2018-12-13 17:57:55 +00:00
**Janet** is a functional and imperative programming language and bytecode interpreter. It is a
2020-05-16 19:12:21 +00:00
lisp-like language, but lists are replaced
2020-03-14 01:00:32 +00:00
by other data structures (arrays, tables (hash table), struct (immutable hash table), tuples).
2019-02-17 19:00:15 +00:00
The language also supports bridging to native code written in C, meta-programming with macros, and bytecode assembly.
2017-04-25 22:22:43 +00:00
2020-10-26 13:44:17 +00:00
There is a REPL for trying out the language, as well as the ability
2017-04-25 22:22:43 +00:00
to run script files. This client program is separate from the core runtime, so
2020-10-26 13:44:17 +00:00
Janet can be embedded in other programs. Try Janet in your browser at
2018-10-23 17:54:55 +00:00
[https://janet-lang.org ](https://janet-lang.org ).
2017-04-25 22:22:43 +00:00
2019-03-31 22:15:28 +00:00
< br >
2018-09-06 02:18:42 +00:00
## Use Cases
2020-03-14 01:00:32 +00:00
Janet makes a good system scripting language, or a language to embed in other programs.
It's like Lua and Guile in that regard. It has more built-in functionality and a richer core language than
Lua, but smaller than GNU Guile or Python.
2018-09-06 02:18:42 +00:00
2018-01-12 15:41:27 +00:00
## Features
2018-10-23 17:54:55 +00:00
* Minimal setup - one binary and you are good to go!
2020-10-26 13:44:17 +00:00
* First-class closures
2018-01-24 22:59:00 +00:00
* Garbage collection
2020-10-26 13:44:17 +00:00
* First-class green threads (continuations)
* Python-style generators (implemented as a plain macro)
2018-01-24 22:59:00 +00:00
* Mutable and immutable arrays (array/tuple)
* Mutable and immutable hashtables (table/struct)
* Mutable and immutable strings (buffer/string)
2020-05-16 19:12:21 +00:00
* Macros
2018-01-24 22:59:00 +00:00
* Byte code interpreter with an assembly interface, as well as bytecode verification
2020-10-26 13:44:17 +00:00
* Tail call Optimization
2018-01-27 20:15:09 +00:00
* Direct interop with C via abstract types and C functions
* Dynamically load C libraries
2018-06-02 23:16:13 +00:00
* Functional and imperative standard library
2018-02-06 06:25:48 +00:00
* Lexical scoping
2018-07-04 04:17:34 +00:00
* Imperative programming as well as functional
2018-01-29 20:46:26 +00:00
* REPL
2020-10-26 13:44:17 +00:00
* Parsing Expression Grammars built into the core library
2020-03-14 01:00:32 +00:00
* 400+ functions and macros in the core library
2019-01-24 15:16:24 +00:00
* Embedding Janet in other programs
2018-07-04 04:17:34 +00:00
* Interactive environment with detailed stack traces
2018-05-19 01:31:46 +00:00
2018-06-26 18:06:38 +00:00
## Documentation
2018-05-19 01:31:46 +00:00
2019-04-29 22:35:09 +00:00
* For a quick tutorial, see [the introduction ](https://janet-lang.org/docs/index.html ) for more details.
* For the full API for all functions in the core library, see [the core API doc ](https://janet-lang.org/api/index.html )
2018-01-24 22:59:00 +00:00
2020-10-26 13:44:17 +00:00
Documentation is also available locally in the REPL.
2019-03-31 22:11:29 +00:00
Use the `(doc symbol-name)` macro to get API
documentation for symbols in the core library. For example,
2018-11-17 03:36:47 +00:00
```
(doc doc)
```
Shows documentation for the doc macro.
2019-01-06 08:23:03 +00:00
2018-11-17 03:36:47 +00:00
To get a list of all bindings in the default
2020-03-07 15:49:25 +00:00
environment, use the `(all-bindings)` function. You
2020-10-26 13:44:17 +00:00
can also use the `(doc)` macro with no arguments if you are in the REPL
2020-03-07 15:49:25 +00:00
to show bound symbols.
2018-11-17 03:36:47 +00:00
2019-05-01 15:04:41 +00:00
## Source
You can get the source on [GitHub ](https://github.com/janet-lang/janet ) or
2019-05-01 15:06:20 +00:00
[SourceHut ](https://git.sr.ht/~bakpakin/janet ). While the GitHub repo is the official repo,
2019-05-01 15:04:41 +00:00
the SourceHut mirror is actively maintained.
2019-04-01 00:24:56 +00:00
## Building
2020-05-18 06:32:00 +00:00
### macOS and Unix-like
2019-04-01 00:24:56 +00:00
2019-06-30 14:57:49 +00:00
The Makefile is non-portable and requires GNU-flavored make.
2019-04-01 00:24:56 +00:00
```
cd somewhere/my/projects/janet
make
make test
make repl
```
2020-05-15 06:51:21 +00:00
Find out more about the available make targets by running `make help` .
2019-05-15 01:23:38 +00:00
### 32-bit Haiku
2020-10-26 13:44:17 +00:00
32-bit Haiku build instructions are the same as the UNIX-like build instructions,
2019-05-15 01:23:38 +00:00
but you need to specify an alternative compiler, such as `gcc-x86` .
```
cd somewhere/my/projects/janet
make CC=gcc-x86
make test
make repl
```
2019-04-01 00:24:56 +00:00
### FreeBSD
2020-10-26 13:44:17 +00:00
FreeBSD build instructions are the same as the UNIX-like build instructions,
2019-05-24 00:30:31 +00:00
but you need `gmake` to compile. Alternatively, install directly from
packages, using `pkg install lang/janet` .
2019-04-01 00:24:56 +00:00
```
cd somewhere/my/projects/janet
2019-05-24 00:30:31 +00:00
gmake
gmake test
2019-04-01 00:24:56 +00:00
gmake repl
```
2020-07-26 23:17:22 +00:00
### NetBSD
2020-10-26 13:44:17 +00:00
NetBSD build instructions are the same as the FreeBSD build instructions.
2020-07-26 23:17:22 +00:00
Alternatively, install directly from packages, using `pkgin install janet` .
2019-04-01 00:24:56 +00:00
### Windows
1. Install [Visual Studio ](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&rel=15# ) or [Visual Studio Build Tools ](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=15# )
2. Run a Visual Studio Command Prompt (cl.exe and link.exe need to be on the PATH) and cd to the directory with janet.
3. Run `build_win` to compile janet.
4. Run `build_win test` to make sure everything is working.
2020-05-23 12:15:19 +00:00
To build an `.msi` installer executable, in addition to the above steps, you will have to:
2020-05-22 21:53:31 +00:00
5. Install, or otherwise add to your PATH the [WiX 3.11 Toolset ](https://github.com/wixtoolset/wix3/releases )
2020-05-23 12:15:19 +00:00
6. run `build_win dist`
Now you should have an `.msi` . You can run `build_win install` to install the `.msi` , or execute the file itself.
2020-05-22 21:53:31 +00:00
2019-04-01 00:24:56 +00:00
### Meson
2020-10-26 13:44:17 +00:00
Janet also has a build file for [Meson ](https://mesonbuild.com/ ), a cross-platform build
2020-10-26 15:21:06 +00:00
system. Although Meson has a Python dependency, Meson is a very complete build system that
2019-06-30 14:57:49 +00:00
is maybe more convenient and flexible for integrating into existing pipelines.
Meson also provides much better IDE integration than Make or batch files, as well as support
2020-10-26 13:44:17 +00:00
for cross-compilation.
2019-04-01 00:24:56 +00:00
2020-03-07 15:49:25 +00:00
For the impatient, building with Meson is as follows. The options provided to
2019-10-05 15:38:58 +00:00
`meson setup` below emulate Janet's Makefile.
```sh
git clone https://github.com/janet-lang/janet.git
cd janet
meson setup build \
--buildtype release \
--optimization 2 \
2020-06-14 17:12:41 +00:00
--libdir /usr/local/lib \
2019-10-05 15:38:58 +00:00
-Dgit_hash=$(git log --pretty=format:'%h' -n 1)
ninja -C build
# Run the binary
build/janet
# Installation
ninja -C build install
```
2019-07-27 03:43:54 +00:00
## Development
Janet can be hacked on with pretty much any environment you like, but for IDE
lovers, [Gnome Builder ](https://wiki.gnome.org/Apps/Builder ) is probably the
best option, as it has excellent meson integration. It also offers code completion
2019-12-15 21:41:58 +00:00
for Janet's C API right out of the box, which is very useful for exploring. VSCode, Vim,
Emacs, and Atom will have syntax packages for the Janet language, though.
2019-07-27 03:43:54 +00:00
2018-12-08 23:09:18 +00:00
## Installation
2019-06-24 21:09:40 +00:00
See [the Introduction ](https://janet-lang.org/introduction.html ) for more details. If you just want
2020-03-07 15:49:25 +00:00
to try out the language, you don't need to install anything. You can also move the `janet` executable wherever you want on your system and run it.
2019-03-24 03:27:13 +00:00
2018-03-16 19:52:56 +00:00
## Usage
2020-10-26 13:44:17 +00:00
A REPL is launched when the binary is invoked with no arguments. Pass the -h flag
2018-09-06 02:18:42 +00:00
to display the usage information. Individual scripts can be run with `./janet myscript.janet`
2018-03-16 19:52:56 +00:00
2018-07-04 04:17:34 +00:00
If you are looking to explore, you can print a list of all available macros, functions, and constants
2020-10-26 13:44:17 +00:00
by entering the command `(all-bindings)` into the REPL.
2018-07-04 04:17:34 +00:00
2018-03-16 19:52:56 +00:00
```
2020-03-07 15:49:25 +00:00
$ janet
Janet 1.7.1-dev-951e10f Copyright (C) 2017-2020 Calvin Rose
2018-09-06 02:18:42 +00:00
janet:1:> (+ 1 2 3)
2018-03-16 19:52:56 +00:00
6
2018-09-06 02:18:42 +00:00
janet:2:> (print "Hello, World!")
2018-03-16 19:52:56 +00:00
Hello, World!
nil
2019-02-27 19:39:00 +00:00
janet:3:> (os/exit)
2020-03-07 15:49:25 +00:00
$ janet -h
usage: build/janet [options] script args...
2018-03-16 19:52:56 +00:00
Options are:
2020-03-07 15:49:25 +00:00
-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
2020-10-26 13:44:17 +00:00
-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)
2020-03-07 15:49:25 +00:00
-k : Compile scripts but do not execute (flycheck)
-m syspath : Set system path for loading global modules
-c source output : Compile janet source code into an image
2020-10-26 13:44:17 +00:00
-n : Disable ANSI color output in the REPL
2020-03-07 15:49:25 +00:00
-l path : Execute code in a file before running the main script
-- : Stop handling options
2018-03-16 19:52:56 +00:00
```
2020-03-07 15:49:25 +00:00
If installed, you can also run `man janet` and `man jpm` to get usage information.
2019-03-31 22:11:29 +00:00
2019-01-24 15:16:24 +00:00
## Embedding
2020-03-07 15:49:25 +00:00
Janet can be embedded in a host program very easily. The normal build
will create a file `build/janet.c` , which is a single C file
2019-03-23 17:50:50 +00:00
that contains all the source to Janet. This file, along with
2020-05-13 21:54:44 +00:00
`src/include/janet.h` and `src/conf/janetconf.h` can be dragged into any C
2019-03-23 17:50:50 +00:00
project and compiled into the project. Janet should be compiled with `-std=c99`
on most compilers, and will need to be linked to the math library, `-lm` , and
the dynamic linker, `-ldl` , if one wants to be able to load dynamic modules. If
there is no need for dynamic modules, add the define
2019-01-24 15:16:24 +00:00
`-DJANET_NO_DYNAMIC_MODULES` to the compiler options.
2020-03-07 15:49:25 +00:00
See the [Embedding Section ](https://janet-lang.org/capi/embedding.html ) on the website for more information.
2018-03-18 19:05:31 +00:00
## Examples
2018-03-16 19:52:56 +00:00
2018-09-06 02:18:42 +00:00
See the examples directory for some example janet code.
2018-12-29 18:13:57 +00:00
2019-02-01 18:43:16 +00:00
## Discussion
2019-01-19 18:03:42 +00:00
2020-10-26 13:44:17 +00:00
Feel free to ask questions and join the discussion on the [Janet Gitter Channel ](https://gitter.im/janet-language/community ).
2019-02-01 18:43:16 +00:00
Alternatively, check out [the #janet channel on Freenode ](https://webchat.freenode.net/ )
2019-01-19 18:03:42 +00:00
2019-05-17 13:48:08 +00:00
## FAQ
2020-10-26 13:44:17 +00:00
### Why is my terminal spitting out junk when I run the REPL?
2019-05-17 13:48:08 +00:00
Make sure your terminal supports ANSI escape codes. Most modern terminals will
2020-05-18 06:32:00 +00:00
support these, but some older terminals, Windows consoles, or embedded terminals
2020-10-26 13:44:17 +00:00
will not. If your terminal does not support ANSI escape codes, run the REPL with
2019-05-17 13:48:08 +00:00
the `-n` flag, which disables color output. You can also try the `-s` if further issues
ensue.
2018-12-29 18:13:57 +00:00
## Why Janet
2018-12-29 22:23:31 +00:00
Janet is named after the almost omniscient and friendly artificial being in [The Good Place ](https://en.wikipedia.org/wiki/The_Good_Place ).
2018-12-29 18:20:13 +00:00
2018-12-29 18:21:13 +00:00
< img src = "https://raw.githubusercontent.com/janet-lang/janet/master/assets/janet-the-good-place.gif" alt = "Janet logo" width = "115px" align = "left" >