概要
- Janetはシンプルで強力なLisp系プログラミング言語
- ネイティブバイナリへの配布や埋め込みが容易
- テキストパースやサブプロセスDSLが優秀
- ミュータブル・イミュータブルコレクションやマクロも充実
- 独自の快適な文法と思想
Janetを使うべき理由
- Janet は、現代的で親しみやすい Lisp方言 のプログラミング言語
- 私はJanetに魅了され、本まで執筆し無料公開
- Janetの魅力を知ってほしいと考え、ここでその理由を紹介
Janetのシンプルさ
- 命令数 はわずか8つ(do, def, var, set, if, while, break, fn)
- JavaScriptに似た ランタイムセマンティクス で直感的
- 標準ライブラリも 1ページに収まる ほどコンパクト
- 学習コスト が非常に低く、午後だけで習得可能
Janetの配布・実行形式
- Janetプログラムは ネイティブバイナリ に簡単に変換可能
- Janetランタイムごと 静的リンク され、配布先に依存不要
- Cコンパイラ でビルドする仕組みにより、自己埋め込み型バイナリ生成
- 1MB未満の 軽量バイナリ (例: 784K on aarch64 macOS)
- Janetランタイム・GC・バイトコードコンパイラすべて内包
Janetのテキストパース能力
- 正規表現ではなく Parsing Expression Grammar (PEG) ベース
- マルチラインやHTML/JSON/バイナリフォーマットも 柔軟に解析
- 構造的かつ合成可能なパーサ が標準で利用可能
- 学習も 簡単
JanetのサブプロセスDSL
- サードパーティライブラリ sh による強力なシェルスクリプトDSL
- 例:
($ find . -name *.janet | say)
- 例:
- パイプやリダイレクト を直感的に記述可能
- PerlやBashの代替としても 優秀
Janetの埋め込み性
- Janetランタイムは 小さなCライブラリ
- Cから簡単に 関数呼び出し・値操作 が可能
- ウェブサイトへの埋め込みや カスタムDSL 構築にも最適
Janetのコレクション型
- ミュータブル ・ イミュータブル 両方のコレクションを標準搭載
- イミュータブルコレクションは 値セマンティクス
- ミュータブルコレクションは 参照セマンティクス
- 標準ライブラリに イミュータブル複合値 があるのは珍しい特徴
Janetのマクロ
- マクロを学ばずとも 通常利用可能
- コード生成 の楽しさと強力さ
- Janetのマクロは 衛生的ではない が、 リテラル関数のアンコート で透明性確保
- 抽象構文木操作 がシンプルかつエレガント
Janetのコンパイル時・実行時の値受け渡し
- 値のシリアライズ と スナップショット実行 が可能
- コンパイル時にトップレベルのコードを 実行し状態を保存
- 共有参照やジェネレータの状態も保持
- マクロ無しでもこの仕組みを活用可能
- 例: ゲームのスプライン事前計算やアセット埋め込み
Janetの文法と書き心地
- シンプル・統一感・多様性の 絶妙なバランス
- 括弧を多用しつつ、[]や{}で 構造を明確化
- ミュータブルリテラルは @記法
- 無名関数や 関数リフティングの簡潔記法
- バッククォートで エスケープ不要な文字列リテラル
- 可変長引数 は&記法
- リーダーマクロ非対応 で文法の一貫性維持
Janetの思想と伝統との違い
- CAR→first, PROGN→do, LAMBDA→fn, SETQ→def
- nilは独自型で 空リストではない
- 真偽値はファーストクラス
- EQ, EQL, EQUAL, EQUALPなどの 伝統的関数は非搭載
- 連結リスト不在 で現代的な設計
- 伝統的Lispのイメージに囚われず、 新しい快適さ を追求