janet/README.md

131 lines
5.2 KiB
Markdown
Raw Normal View History

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)
 
[![Appveyor Status](https://ci.appveyor.com/api/projects/status/bjraxrxexmt3sxyv/branch/master?svg=true)](https://ci.appveyor.com/project/bakpakin/janet/branch/master)
[![Build Status](https://travis-ci.org/janet-lang/janet.svg?branch=master)](https://travis-ci.org/janet-lang/janet)
2019-02-16 00:58:25 +00:00
[![builds.sr.ht status](https://builds.sr.ht/~bakpakin/janet/.freebsd.yaml.svg)](https://builds.sr.ht/~bakpakin/janet/.freebsd.yaml?)
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-13 17:57:55 +00:00
**Janet** is a functional and imperative programming language and bytecode interpreter. It is a
2018-05-19 01:31:46 +00:00
modern lisp, but lists are replaced
by other data structures with better utility and performance (arrays, tables, structs, 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
2017-07-02 02:46:56 +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
janet could be embedded into 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
Janet makes a good system scripting language, or a language to embed in other programs. Think Lua or Guile.
## Features
2018-10-23 17:54:55 +00:00
* 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)
2018-07-04 04:17:34 +00:00
* Lisp Macros
* Byte code interpreter with an assembly interface, as well as bytecode verification
2018-10-23 17:54:55 +00:00
* Tailcall Optimization
* Direct interop with C via abstract types and C functions
* Dynamically load C libraries
* Functional and imperative standard library
* 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
* Parsing Expression Grammars built in to the core library
* 300+ functions and macros in the core library
* 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
* For a quick tutorial, see [the introduction](https://janet-lang.org/introduction.html) for more details.
* For an overview of functions in the core library, see [the function index](https://janet-lang.org/funcindex.html).
* For the full API for all functions in the core library, see [the core API doc](https://janet-lang.org/doc.html)
Documentation is also available locally in the repl.
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.
2018-11-17 03:36:47 +00:00
To get a list of all bindings in the default
environment, use the `(all-symbols)` function.
## Installation
See [the Introduction](https://janet-lang.org/introduction.html) for more details.
2018-03-16 19:52:56 +00:00
## Usage
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
2019-01-31 12:52:57 +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
```
2018-09-06 02:18:42 +00:00
$ ./janet
Janet 0.0.0 alpha Copyright (C) 2017-2018 Calvin Rose
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)
2018-09-06 02:18:42 +00:00
$ ./janet -h
usage: ./janet [options] scripts...
2018-03-16 19:52:56 +00:00
Options are:
2018-07-04 04:17:34 +00:00
-h Show this help
-v Print the version string
-s Use raw stdin instead of getline like functionality
2018-09-06 02:18:42 +00:00
-e Execute a string of janet
2018-07-04 04:17:34 +00:00
-r Enter the repl after running all scripts
-p Keep on executing if there is a top level error (persistent)
-- Stop handling option
2018-03-16 19:52:56 +00:00
$
```
If installed, you can also run `man janet` to get usage information.
## Embedding
The C API for Janet is not yet documented but coming soon.
Janet can be embedded in a host program very easily. There is a make target
`make amalg` which creates the file `build/janet.c`, which is a single C file
that contains all the source to Janet. This file, along with
`src/include/janet.h` and `src/include/janetconf.h` can dragged into any C
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
`-DJANET_NO_DYNAMIC_MODULES` to the compiler options.
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-02-01 18:43:16 +00:00
Feel free to ask questions and join discussion on the [Janet Gitter Channel](https://gitter.im/janet-language/community).
Alternatively, check out [the #janet channel on Freenode](https://webchat.freenode.net/)
2018-12-29 18:13:57 +00:00
## Why Janet
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">
2019-01-19 17:42:33 +00:00