
Janet — シンプルで実用的なLisp方言
Janet は第一級関数、単一の名前空間、字句ブロックスコープを備えた命令型言語である。8つのコア命令(do、def、var、set、if、while、break、fn)で言語の中核が構成され、テキスト解析、組み込み性、マクロサポートなどの機能を備えている。
バイトコードコンパイルと C ランタイム起動により、単純な hello world プログラムでも 784K(Janet 1.27.0 on aarch64 macOS)の実行バイナリを生成する。テキスト処理は正規表現ではなく解析式文法に基づき、マクロはコンパイル時から実行時への値の暗黙的シリアライゼーション機構を備えている。
コア言語設計
Janet の言語中核は 8 つの命令のみで構成される:do、def、var、set、if、while、break、fn。この最小限の設計により、言語仕様全体が 1 ページに収まる標準ライブラリとなっている。
Janet は命令型でありながら第一級関数をサポートし、単一の名前空間ですべての識別子を管理する。字句ブロックスコープにより変数のスコープが明確に定義される。
構文と型システム
Janet は括弧、ブラケット [] によるリスト、ブレース {} によるテーブルを用いる。可変リテラルは @ で始まり、匿名関数は fn 記法と短縮記法 | でサポートされる。スプレッド演算子は ; で、残り引数は & で表現される。
文字列リテラルはバッティックの個数を任意に設定でき、可変・不変両方のコレクション型が存在する。Janet は CAR を first、PROGN を do、LAMBDA を fn、SETQ を def と改名するなど、従来の Lisp 関数の名称を現代的に調整している。
テキスト処理と組み込み
Janet のテキス処理は正規表現ではなく解析式文法(PEG)に基づいている。第三者ライブラリの sh はシェルスクリプト DSL を提供する。Janet は単純な hello world を native バイナリにコンパイルでき、Janet 1.27.0 on aarch64 macOS では 784K となる。
コンパイル時から実行時への値の暗黙的シリアライゼーション機能により、コンパイル時計算結果を実行時に活用できる。
マクロサポート
Janet はマクロをサポートし、伝統的な Lisp と異なり reader macros は非サポートである。コンパイル時から実行時への値の暗黙的シリアライゼーション機構は、マクロなしでも活用可能とされる。
筆者の見立て
- Janet で書いたテキスト処理能力は、不当に優れていると評価している
- 『Janet for Mortals』というJanet に関する書籍を執筆し、インターネット上で無料公開することを推奨している
- マクロの記述は他のプログラミングとは異なる楽しさを提供していると論じている
- Janet のマクロアプローチを「繊細な問題に対する非常にシンプルで優雅なソリューション」と解釈している
- コンパイル時から実行時への値の暗黙的シリアライゼーション機能を「スーパーパワー」として解釈している
- データベースバインディングの自動生成のようなユースケースでは、ほとんどの言語で実装困難となる可能性を示唆している
- Janet の構文バランス(シンプルさ、統一性、多様性)に優れていると評価している
- 括弧を見て FORMAT が後に続くと仮定した場合でも、Janet に再度目を向ける価値があると論じている
この記事は元記事の事実のみに基づいて自動生成されました。
出典
Ian Henry 著「Why Janet?」 https://ianthehenry.com/posts/why-janet/