概要
- Lisette はRustに着想を得た 小型言語 で、Goに コンパイル される
- 代数的データ型 ・ パターンマッチ ・ Hindley-Milner型推論 ・ デフォルト不変 などをサポート
- Goエコシステムとの 高い互換性 を持つ
- nil禁止 ・ エラー安全 ・ 型安全なAPI設計 が特徴
- VSCode/Neovim/Zed などの LSP対応 も完備
Lisette言語の特徴
-
Rust風構文 と Go互換性 の両立
- Goのパッケージを
import "go:..."で直接利用可能 cargo install lisetteでインストール
- Goのパッケージを
-
代数的データ型(ADTs)とパターンマッチ
enumで複数バリアントを定義match式で安全に分岐- 網羅性チェック による安全性強化
-
構造体とimplブロック
structでデータ構造定義implでメソッド実装- 不変デフォルト ・ 明示的可変(let mut)
-
式指向・if let・let else構文
- すべてが式として値を返す
if letやlet elseによるパターンバインディング
-
インターフェースとジェネリクス
interfaceで抽象化- 型パラメータによる汎用関数
-
Option/Resultによるエラー・欠損値管理
- nil禁止、欠損は
Option<T>、エラーはResult<T, E> ?演算子でエラー伝播- Resultの未処理検知 ・明示的破棄サポート
- nil禁止、欠損は
-
Goとのシームレスな型変換
- Lisetteコード→Goコードへの安全な変換
- 例:パターンマッチやエラー伝播がGoのif文・switch文に自動変換
-
パイプライン演算子・ラムダ式・メソッドチェーン
|>で関数合成- 無名関数・チェーン処理で記述性向上
-
非同期・並行処理対応
taskでGoのgoroutine相当Channel型とselect式で競合解決
-
tryブロック・panic/recover
- 例外的状況も型安全に処理
recoverでpanicから安全に復帰
-
属性によるシリアライズ・バリデーション
#[json(...)]や#[tag(...)]で詳細な制御
-
詳細なエラーメッセージとヒント
- 網羅性・可変性・型の公開範囲・未初期化などを静的検査
- 例:
matchの未カバー・nil禁止・private type公開警告
Lisette言語の主な構文例
-
パターンマッチ
enum Message { Ready, Write(string), Move { x: int, y: int } } fn handle(msg: Message) -> string { match msg { Message.Ready => "ready", Message.Write(text) => f"wrote: {text}", Message.Move { x, y } => f"move to ({x}, {y})", } } -
if let/let else
type Headers = Map<string, string> fn handle_headers(h: Headers) -> Result<(), string> { if let Some(token) = h.get("Authorization") { let user = authenticate(token)? authorize(user)? } else { return Err("missing credentials") } let Some(id) = h.get("X-Request-ID") else { return Err("missing request ID") } process(id) } -
パイプライン演算子
import "go:strings" fn slugify(input: string) -> string { input |> strings.TrimSpace |> strings.ToLower |> strings.ReplaceAll(" ", "-") } slugify(" Hello World ") // => "hello-world" -
並行処理
let ch1 = Channel.new<string>() let ch2 = Channel.new<string>() task { ch1.send(fetch_primary()) } task { ch2.send(fetch_replica()) } let quickest = select { match ch1.receive() { Some(v) => v, None => "closed", }, match ch2.receive() { Some(v) => v, None => "closed", }, } -
Goへのコンパイル例
// Lisette fn classify(opt: Option<int>) -> string { match opt { Some(x) if x > 0 => "positive", Some(x) if x < 0 => "negative", Some(_) => "zero", None => "none", } } // Go func classify(opt lisette.Option[int]) string { if opt.Tag == lisette.OptionSome { x := opt.SomeVal if x > 0 { return "positive" } if x < 0 { return "negative" } return "zero" } return "none" }
静的検査・エラーメッセージ例
- match網羅性チェック
- 未カバー分岐を検出し、ヒントを表示
- nil禁止
- 欠損値は必ず
Option<T>で表現
- 欠損値は必ず
- Result未処理警告
?やmatchで必ずハンドリング
- private type公開警告
- 公開APIにprivate型を含めると警告
- 不変変数の可変渡し警告
let mutで明示的に可変化
- 構造体の未初期化警告
- すべてのフィールド初期化が必須
開発環境サポート
- LSP対応 :VSCode、Neovim、Zedなど主要エディタ
- Goエコシステムとの連携 :Goのライブラリ・ツールチェーンを活用可能
Lisetteは 型安全性・エラー安全性・Go互換性 を高次元で両立した、 現代的なシステムプログラミング言語。Rustの洗練とGoの実用性を両取りしたい開発者に最適。