世界を動かす技術を、日本語で。

チキンスキーム 6.0

2026年8月11日原文(code.call-cc.org)

概要

  • CHICKEN Scheme 6.0.05.4.0 の主な変更点と改善点を要約
  • R7RS small language 完全対応や UNICODE対応 などコア機能強化
  • モジュール構成の見直しファイル操作・プロセス管理API の刷新
  • ビルドシステム・ツールチェーン の近代化
  • セキュリティ修正細かなバグフィックス も多数実施

CHICKEN Scheme 6.0.0 主な変更点

  • R7RS small language で指定された全モジュールをコアシステムで利用可能
  • 内部文字列表現 をUTF-8へ変更、 完全なUNICODE対応 を実現
  • (chicken blob)モジュール(chicken bytevector)モジュール へ置換、R7RS互換のバイトベクタ操作を提供
    • バイトベクタはSRFI-4のu8vectorと完全互換
  • blobのread構文#${...})を廃止、バイトベクタは#u8(...)#u8"..."で読込
  • char-name で名前付き文字定義の削除が可能に
  • open-input-file / open-output-file でファイルエンコーディング指定可能(UTF-8/Latin-1対応)
  • file-read, file-write, set-pseudo-random-seed!, random-bytes はバイトベクタのみ受け入れ、文字列は非対応
  • プロセス操作API刷新
    • process-fork, process-run, process, process*はPIDでなくプロセスオブジェクトを返却
    • process-wait, process-signalはPIDまたはプロセスオブジェクト受け入れ
  • ファイルロック操作 をflock(2)に統一、スレッドセーフ化・簡素化
    • file-test-lock廃止
  • read-u8vector, read-u8vector!, write-u8vector を削除、(chicken io)モジュールの同等操作を利用
    • read-bytevector, read-bytevector!, write-bytevectorを(chicken io)に追加
  • set-port-name! 廃止、SRFI-17のsetterでport-nameを設定
  • port-encoding を(chicken port)モジュールに追加
  • make-input-port, make-output-port のオプションメソッドはキーワード引数化
  • make-binary-input-port, make-binary-output-port を追加
  • 文字列のロカティブ はバイト単位でなくコードポイント単位でインデックス
  • symbol-escape でシンボルのエスケープ表示制御が可能に
  • シンボル表示 のエスケープ判定がより厳格化

プリミティブ・モジュール再編

  • 多数の手続きが(chicken base)等からR7RSモジュールへ移動
    • exact-integer?, exact-integer-sqrt?, vector-copy!, make-parameter, call/cc, open-input-string, open-output-string, get-output-string, input-port-open?, output-port-open?, parameterize, port?は(scheme base)へ
    • case-lambdaは(scheme case-lambda)へ、featuresは(scheme base)へ
    • write-stringは(scheme base)へ移動しR7RS仕様に変更
    • define-record-typeは(scheme base)へ、生成的型対応
    • syntax-errorは(chicken syntax)から削除、マクロとして(scheme base)へ
  • record-instance?, make-record-instanceは非シンボル型指定にも対応
  • 新モジュール(chicken number-vector)でSRFI-4の上位互換(64/128bit複素ベクタ含む)を提供
  • load, load-relativeの第2引数は環境または評価手続き指定可能
  • srfi-0, srfi-6, srfi-9, srfi-11, srfi-23, srfi-39, srfi-98のモジュールエイリアスを廃止(R7RSでカバー)
  • r4rs, r5rs, r4rs-null, r5rs-nullは(scheme XXX)へリネーム
  • 16進エスケープは;で終端必須(R7RS準拠)
  • #ci / #cs構文を廃止、#![no-]fold-caseマーカーを利用
  • include, include-relativeは複数ファイル指定可能、include-ci追加
  • include-pathを(chicken platform)モジュールに追加
  • number-vector-dataを(chicken memory representation)モジュールに追加
  • define-libraryでexport-all指定対応
  • mingw32プラットフォーム識別子をmingwへ変更
  • パス返却手続きは常にスラッシュ区切り、make-pathnameも"/"固定
  • expand1を(chicken syntax)モジュールに追加、csiに",x1"コマンド追加
  • (chicken version)モジュール新設
  • delete-file*, delete-fileは壊れたシンボリックリンクも一貫して処理
  • number->stringは基数36まで対応(従来は16まで)
  • string->numberは18進以上での"i"の曖昧ケースをより一貫して処理
  • make-rectangularは虚部が不正確なゼロでも複素数返却
  • string->number/リーダーは虚部が負の不正確ゼロの複素数も正しく処理
  • imag-partは非複素数に対し正確なゼロを返却
  • max/minは非nan引数が含まれる場合nan値を無視

その他の主な機能追加・改善

  • syntax-rulesで末尾パターンの...(エリプシス)サポート強化
  • FFI強化:文字列・シンボルはコピーせず直接渡し、外部コードの変更がScheme側に反映
    • 複素数・C構造体・ユニオンもC側引数/戻り値として直接扱えるように
  • コンパイラ/インタプリタの-r5rs-syntaxオプションは-r7rs-syntaxへリネーム、拡張シンボル構文は無効化しない
  • "feathers"デバッガはコアから分離しeggとして提供
  • set-describer!はcsiモジュールから削除
  • cscプログラムはツールフラグ(例: -compiler, -cc等)でスペース含むパスをクォート不要で指定可能
    • 代償として、スペース区切りのフラグ指定は非対応。必要ならシェルスクリプトで対応
  • chicken-installはeggインストール時にキャッシュディレクトリをロック
  • eggフォーマットにinstalled-c-object型追加
  • csc-options/link-optionsにcustom-config対応、任意のコンパイラ/リンカオプション生成可能
  • scripts/smoke-test.sh追加で基本テスト自動化
  • -merge-reusable-closures/-merge-shareable-closuresオプション追加、クロージャ再利用/共有によるメモリ削減
    • 最適化レベル1(再利用)、2(共有)で自動有効化
  • ビルドシステム刷新:"configure"スクリプト導入でmake運用・プラットフォームチェック強化
  • Windowsの最小mingwビルドは非サポート、POSIXシェルとCLIユーティリティ必須
    • 推奨ツールチェーンはChris Wellons "w64devkit"
    • mingw-msysプラットフォーム識別子はmingwへリネーム
  • "zig cc"によるビルドもサポート

CHICKEN Scheme 5.4.0 主な変更点

セキュリティ修正

  • CVE-2022-45145 :eggメタデータのエスケープ文字無効化でOSコマンドインジェクション防止
  • ランタイムオプション"-:b"を削除、CLIからREPL落ち禁止で安全性向上
  • ランタイムオプション処理の堅牢化、最初の非ランタイムオプションまたは"-:"で終了

コアライブラリ・API改善

  • file-selectの型宣言修正
  • create-temporary-file/directoryのWindowsフォールバックで%USERPROFILE%/AppData/Local/Tempを利用(環境変数が設定時)
  • POSIXシグナル用スレッドセーフAPI(make-signal-handler, signal-ignore, signal-default)追加、既存API非推奨
  • make-finalizerでファイナライザのスレッドセーフ実行
  • (chicken base)にweak pair追加、Chez Schemeに類似
  • locative-index追加(John Croisant寄稿)
  • chicken.flonumモジュールにfp*+(融合積和演算)、双曲線関数・逆関数追加(Christian Himpe提案)
  • process-executeはargv[0]にファイル名を修正前のまま設定(従来はディレクトリ部除去)
  • SRFI-4ベクタリテラルで埋め込み文字列・文字対応
  • read-with-source-infoを(chicken syntax)で公式サポート、read/source-infoは内部モジュールで非推奨
  • (chicken module)にexport/rename追加、エクスポート時の識別子リネーム対応
  • TMPDIR, TMP, TEMP環境変数値はキャッシュせず都度取得(#1830修正)
  • errno変更手続きを発生させた条件オブジェクトにerrnoプロパティ追加
  • chicken-home非推奨、chicken.platformモジュールにinclude-path追加
  • Irregexを0.9.11へ更新、utf-8関連修正・空白文字集合拡張

ツール・ビルドシステム改善

  • chicken-installのWindows向けスクリプト生成でechoの">>"クォート問題を修正(Jani Hakala報告・修正)
  • csi/cscの-Rオプションでリスト記法(例: (srfi 1))対応(#1809, Wolfgang Corcoran-Mathe報告)
  • cscから他ツールへのオプション渡し時のシェルクォート修正(#1302, Xin Wang報告)
  • cscの-prelude/-postludeオプションが正常動作
  • chicken-installは再インストール時に最新版egg取得(#1802)
  • setup.defaultsのlocation指定時、egg探索で2種類のレイアウト考慮
  • chicken-install: #1684修正(component-dependencies指定プログラムのimportライブラリ依存性対応)
  • chicken-installはローカルeggのキャッシュ対応
  • chicken-installは-location(-l)オプションでeggソース取得ディレクトリ指定可能
  • chicken-installは予期しないプロパティに警告表示(#1492)
  • chicken-installはキャッシュメタデータ用ディレクトリを分離、MacOS等の大文字小文字非区別ファイルシステムでも衝突防止(#1753, Kon Lovett報告)
  • Syntax expanderでevalにモジュールを環境として渡す際、マクロ展開時の識別子解決を正しく処理(#1295, Caolan McMahon報告)
  • コア特殊形式の内部定義は再束縛を尊重(#1132)
  • グローバル定義でマクロ再束縛時に完全にシャドウ可能(#1166, Michele La Monaca報告)
  • 型ファイル出力時、リストをソートしてビルド結果を決定的に(#1783, "ss2"報告)
  • ビルドシステムでゼロサイズmemsetの警告回避(Claude Marinier報告)
  • Windowsでtest-create-temporary-fileの無効化("jjhoo"報告)
  • MacOSでXCODE_...環境変数の利用を廃止

この内容はCHICKEN Scheme 6.0.0および5.4.0の主なリリースノートを日本語で簡潔にまとめたものです。

Hackerたちの意見

みんなが興味あるかもしれないけど、このバージョン6.0はCrunchをサポートしてるよ(ただし、Crunch自体はまだ1.0にはなってなくて、今は@.993)。CrunchはScheme R7RSの静的型付けサブセットのためのコンパイラなんだって。(https://wiki.call-cc.org/eggref/6/crunch)

CRUNCHは本当にクールだよ。Windowsでうまく動くように手伝ったんだけど(ちょっと設定が必要だけどね)。

イントロとして:CHICKENはSchemeのソースファイルをCに変換するコンパイラで、そのCをCコンパイラに渡すことでスタンドアロンの実行ファイルを生成できるよ。インタープリタもあって、スクリプト環境として使ったり、コンパイル前にプログラムをテストしたりするのに便利だよ。

これって「本番」システムでevalみたいなことができないってこと?

週末にChickenを触り始めたんだけど、バイナリを作れるSchemeを探してて、活気のあるエコシステムがあったからなんだ。すごく楽しんでるよ。今のところ、主にウェブ関連のことをやってる。makemkvconのラッパーを作って、ずっとリッピングしたかったDVDを自動的に名前付けしてくれるようにしてる。v5を使い始めて、v6が出たらどうしようかちょっと心配だったけど、結構前から作業してたみたいだから、v5でしばらくは大丈夫だろうと思ってたんだ。結果的に、間違ってたみたい!

このリリースを心待ちにしてたんだけど、フルUnicodeサポートがついてるんだ。チームにおめでとう!Chicken Schemeはちょっとした宝物だね!

Chicken Schemeを使ってる人に聞きたいんだけど、他のLispよりもこれを選んだ理由は何?特に得意なことって何かある?

コンパイラだね。それがシステムの宝物だよ。生成されたCはかなりポータブルだから、「Schemeが動かない」システムでもSchemeプログラムを実行できるんだ。

エッグは最高だよ。例えば、SDL2のゲームをすぐに作り始めたり、ウェブサーバーをサクッと立ち上げたりできる。geiser-chickenのおかげでEmacsのサポートもいいし、CにコンパイルされるからFFIも使いやすい。Chez Schemeよりもずっと便利だよ。エラーメッセージも役に立つし、スタックトレースもついてるから、これが大事なんだ。オプショナルな型定義もサポートしてて、テストの数が減るのが助かる。ドキュメントはまあまあだけど、検索するときは「MIT scheme」ってよく追加する。NixOSでchicken-docの設定ができなかったし、最近はドキュメントのウェブサイトがよくダウンしてる。チキンのエッグを含む完全なドキュメントがオフライン形式(PDFみたいな)であればいいのに。

自己完結型で、コンパクトで、コンパイル済み、速くて、すぐに使える。SBCLはコンパクトじゃないし、「イメージ」コンセプトはみんなに好かれてるわけじゃない。GuileとRacketは速くもコンパクトでもないし、Chez Schemeは「すぐに使える」わけじゃない。

なんでみんなGambitよりChickenを使うんだろう?Chickenのエコシステムやエッグが大きいから?それとも他に理由があるのかな?

正直、これはすごいアップデートだよ。R7RSのサポートがあって、UTF-8文字列も対応してるし、ついにバイナリデータをバイトベクターに切り替えた。クロージャの再利用最適化も面白そうだし、正直言って。

Hacker Newsで議論の続きを見る