Org Babel support for Janet
  • Emacs Lisp 100%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
nik gaffney 3dbf225cd3
Some checks failed
melpazoid-ob-janet / build (push) Has been cancelled
I'll be right back.
2026-08-20 10:55:32 +02:00
.github/workflows melpazoid 2026-07-21 11:43:14 +08:00
test Oh, yes, it is a very effective fail-safe. 2026-08-03 18:54:25 +08:00
LICENSE I told you not to conjure anything! 2026-07-20 10:51:42 +08:00
ob-janet.el I'll be right back. 2026-08-20 10:55:32 +02:00
README.org I'll be right back. 2026-08-20 10:55:32 +02:00

Introduction

ob-janet provides Org Babel support for the Janet language to enable Janet code blocks in literate Org files.

Installation

The package can be installed from MELPA or manually via codeberg.

Manual Installation

Download ob-janet.el, place it in the load path, and add a require to your init file. It may be necessary to set or customize ob-janet-path and ob-janet-executable if either can't be found by default.

(require 'ob-janet)
(add-to-list 'org-babel-load-languages '(janet . t))

via use-package

(use-package ob-janet
  :after org
  :init
    (setq ob-janet-executable "janet"
          ob-janet-path "/usr/local/lib/janet")
  :config
    (add-to-list 'org-babel-load-languages '(janet . t)))

via straight.el

(use-package ob-janet
  :straight (:host github :repo "zzkt/ob-janet")
  :after org
  :config
  (add-to-list 'org-babel-load-languages '(janet . t)))

Usage

Execute a code block with C-c C-c using the header :results output to capture stdout, or :results value to capture the return value of the block.

(var void 'boundless)
(print "I live in a boundless void.")
(string "The void is " void)
(var void 'boundless)
(print "I live in a boundless void.")
(string "The void is " void)

Variables can be passed from named Org blocks (including tables) or assigned in the header

Name Age
Eleanor 36
Jason 29
Kamilah 31
(each row data
  (print (string "Name: " (row 0) ", Age: " (row 1))))
(print (+ x y))

Header arguments

Header Description Default
:cmd <path> Janet executable or path janet
:results <format> Result format: raw, none, output or value output
:session <name> Session name for persistent eval none
:file <path> Output file path none
:prologue <code> Code to prepend before the body none
:epilogue <code> Code to append after the body none
:debug Show expanded body none

Sessions

Use :session for persistent state (sessions) across code blocks that share the same session name

(var *count* 0)
(defn increment [] (++ *count*) *count*)
(increment)
(increment)
(increment)

Prologue and Epilogue

Use :prologue or :epilogue to include code before or after the main body of the src block.

(def phi^2 (+ phi 1))

File Output

Use :file with a path to write output (or value) to a file

(loop [i :range [1 11]]
  (print i))

see: file:numbers.txt

Debug

Preview expanded code, without evaluation, by adding :debug to the header. The output is the unevaluated code that would be sent to a Janet process.

(+ x 10)
(+ x 10)

Customization

Customize ob-janet settings with the ob-janet customization group, M-x customize-group ob-janet

Variable Description Default
ob-janet-executable Path to Janet executable "janet"
ob-janet-hline-to Replacement for table hlines in Janet "nil"
ob-janet-nil-to Replacement for Janet nil in results 'hline
ob-janet-value-wrapper Template for wrapping value results see: ob-janet.el
ob-janet-output-wrapper Template for wrapping output results see: ob-janet.el

Troubleshooting

Janet not found

Ensure janet is on your PATH, or customize ob-janet-executable to include the full path to the janet executable.

(setq ob-janet-executable "/usr/local/bin/janet")

Modules (or symbols) not found

Modules and libraries are located using the JANET_PATH environment variable. If JANET_PATH is not set, or has been redefined, the variable ob-janet-path can be used to set the correct path.

(setq ob-janet-path "/usr/local/lib/janet/")