リリース 0.9.13


SRFI-226 (制御機構) の部分的なサポート

制御機構のSRFI (srfi:226) はスレッド、動的環境、(部分)継続相互の 関係について明確な定義を与えました。このSRFIはかなり大きく、 まだ全てはサポートしきれいていませんが、部分的に今回のリリースに含まれています。

このSRFIはR7RSに上位互換な拡張となっています。 ただ、GaucheがR7RSに対して独自に拡張していた部分と一部非互換があります。 特に、パラメータの振る舞いに違いがあります。 Gaucheの方針としてはSRFI-226互換に移行する予定ですが、 互換性を考えて現在のリリースでは組み込みのAPIは従来との互換モードで動作するようになっています。 マニュアルのパラメータと動的状態で 変更点を詳しく説明していますが、簡単なまとめは次のとおりです。

SRFIモジュールの名前付け

これまで、SRFIモジュールには srfi-N という名前をつけてきました。 これはR6RSができる前の標準的な名前でした。 現代のSchemeはライブラリをリストで指定するので、SRFIはR7RSでは (srfi N)となります。これはGaucheのモジュールの名前にするとsrfi.Nとなります。 従って、以下のバリエーションはどれでも有効です。

0.9.12までは、ドキュメントでも srfi-N を統一的に使ってきましたが、 0.9.13からは srfi.N という名前の方を「オフィシャル」にすることにしました。 srfi-N もまだ使えますし今後も使えるようにしておく予定ですが、 新規コードではsrfi.Nを使うことをおすすめします。 (内部的には、以前はsrfi-N.scmの方に実体のコードがあり srfi/N.scmはそれを参照しているだけだったのが、本リリースからは逆転しています。)

また、cond-expand でSRFIを調べる場合、 ただsrfi-Nを機能識別子として使うのではなく、 (library srfi.N) (Gaucheコード)あるいは (library (srfi N)) (R7RS) を使うようにしてください。

;; 昔のやり方
(cond-expand
  (srfi-114
    ;; SRFI-114を使うコード
    )
  (else ...))

;; 推奨
(cond-expand
  ((library srfi.114)
   (use srfi.114)
    ;; SRFI-114を使うコード
   )
  (else ...))

;; 推奨 (R7RSポータブル)
(cond-expand
  ((library (srfi 114))
   (import (srfi 114))
    ;; SRFI-114を使うコード
   )
  (else ...))

library条件節がR7RSで導入されるまでは、古いやり方が唯一の方法でした。 現在ではlibraryを使うべきです。 古い方式は、機能テストとライブラリインポートが一緒になっていて、 それが落とし穴になることがあります。 例えばSRFI-101はScheme組み込みの手続きの多くを再定義しています。 古いやり方でsrfi-101をテストすると、同時にsrfi-101をロードしてしまうので、 Schemeの組み込み手続きの多くがシャドウされることになります。 大抵の場合、それは望ましくないでしょう。 新しい方法であれば、srfi.101があることを確かめたうえで、 プレフィクス付き、あるいはリネームしながらsrfi.101の手続きをインポートできます。

環境変数GAUCHE_WARN_SRFI_FEATURE_IDをセットしておくと、 srfi-Nが機能条件式に使われた時に警告が出ます。 将来はこれをデフォルトにする予定です。

インタラクティブ開発の改善

ユーティリティスクリプトの名前

GaucheにはいくつかのSchemeスクリプトが付属しています。 例えばAOTコンパイルを行うprecompなどです。 これは、以前はライブラリディレクトリのトップレベルにインストールされていたので、 gosh precomp で起動することができました。 しかしこういったスクリプトが増えてくると、ライブラリのトップレベルディレクトリが 散らかってきます。そこで、実行可能スクリプト類はまとめてtoolsサブディレクトリに インストールすることにしました。例えばprecompは gosh tools/precomp で起動するようになります。

移行を容易にするため、このリリースではトップレベルディレクトリのスクリプトを直接参照しても 実行できますが、警告が出ます。警告を見たらMakefileなどを書き換えてください。

実数限定の初等関数

実数に限定した関数をreal-*という名前で多数用意しました(例:real-exp)) 一般の(複素数に対応した)バージョンよりも速いので、速度が重要なコードには便利でしょう。 詳しくはReal numerical functionsを。

実はこれまでも、実数限定の初等関数は%expといった名前で定義されていたんですが、 あくまで複素関数版を作るための部品という意図で、直接使われることは意図していませんでした。 ただ、gaucheモジュールから見えるようになっていたため、 速度を気にしてこれらの関数を使っている既存のコードがあるかもしれません。 移行を助けるため、以前の名前を見えるようにした互換モジュール compat.real-elementary-functionsも提供しています。

formatの拡張

formatにいくつか指示子を追加しました。

ダイジェストフレームワークのアップデート

以前のAPIでは、オクテットシーケンスを不完全な文字列として扱っていましたが、 より新しいコードではu8vector (bytevector) を使うのを推奨しています。 APIを見直し、入力は文字列でもu8vectorでも受けつけ、 出力は文字列で得るかu8vectorで得るかを選べるようにしました。

以前のAPIも使えますが、非推奨となります。

影響のあるモジュールは次のとおりです: rfc.hmac, util.digest, rfc.base64, rfc.quoted-printable.

新しい名前づけ規則は:

また、rfc.base64をRFC4648に準拠するように更新しました。 パディングを省略できるようになったほか、同RFCで定義されている base32とbase16のサポートも追加されています。

新SRFI、モジュール、手続き

新SRFI

新モジュール

新手続き・マクロ

その他の追加

いくつかのconfigureオプションの非推奨化

バグフィクス


Last modified : 2023/10/12 11:19:14 UTC