制御機構のSRFI (srfi:226) はスレッド、動的環境、(部分)継続相互の 関係について明確な定義を与えました。このSRFIはかなり大きく、 まだ全てはサポートしきれいていませんが、部分的に今回のリリースに含まれています。
このSRFIはR7RSに上位互換な拡張となっています。 ただ、GaucheがR7RSに対して独自に拡張していた部分と一部非互換があります。 特に、パラメータの振る舞いに違いがあります。 Gaucheの方針としてはSRFI-226互換に移行する予定ですが、 互換性を考えて現在のリリースでは組み込みのAPIは従来との互換モードで動作するようになっています。 マニュアルのパラメータと動的状態で 変更点を詳しく説明していますが、簡単なまとめは次のとおりです。
parameterize
はあくまでパラメータの動的束縛にのみ使います。
パラメータ的な振る舞いをする手続きは新たなマクロ、
temporarilyによって動的に状態を変更できます。
これまで、SRFIモジュールには srfi-N
という名前をつけてきました。
これはR6RSができる前の標準的な名前でした。
現代のSchemeはライブラリをリストで指定するので、SRFIはR7RSでは
(srfi N)
となります。これはGaucheのモジュールの名前にするとsrfi.N
となります。
従って、以下のバリエーションはどれでも有効です。
(use srfi-N)
(伝統的なGaucheコード)
(use srfi.N)
(Gaucheコードの別のやり方)
(import (srfi N))
(R7RSコード)
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
が機能条件式に使われた時に警告が出ます。
将来はこれをデフォルトにする予定です。
w-i-f
からwith-input-from-
が補完されます。
(Segmented completion参照)。
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にいくつか指示子を追加しました。
~:w
(pretty print)
~&
(fresh line)
~
+ 改行 (行継続)
~@r
(ローマ数字) -Unicodeに100000までのローマ数字があるので、
499999までこの指示字で出力できます。
~p
(複数形)
以前のAPIでは、オクテットシーケンスを不完全な文字列として扱っていましたが、 より新しいコードではu8vector (bytevector) を使うのを推奨しています。 APIを見直し、入力は文字列でもu8vectorでも受けつけ、 出力は文字列で得るかu8vectorで得るかを選べるようにしました。
以前のAPIも使えますが、非推奨となります。
影響のあるモジュールは次のとおりです: rfc.hmac, util.digest, rfc.base64, rfc.quoted-printable.
新しい名前づけ規則は:
*-to
の名前を持ち、
望みの戻り値の型を引数に取ります: hmac-to,
hmac-message-to, digest-to,
digest-message-to, base64-decode-string-to,
quoted-printable-decode-string-to.
また、rfc.base64をRFC4648に準拠するように更新しました。 パディングを省略できるようになったほか、同RFCで定義されている base32とbase16のサポートも追加されています。
srfi.236
: independently
ls
の出力のように)
c-w-c-c
を call-with-current-continuation
とマッチする。
%exp
などを提供する互換モジュール。上の「実数限定の初等関数」参照。
test-equal
をサポート。
rotatef
。
:encoding
オプションが与えられなかった場合に使われるエンコーディングを
指定するパラメータ。
(flush)
を入れないとプロンプトが見えないことでユーザを混乱させていました。
今は標準入力ポートと標準出力ポートがリンクされているので自動的にフラッシュされます。
port-link!, port-unlink!参照。
--omit-debug-source-info
オプションを与えると
ソース情報を付加しないようにできます。
#?=expr
は常に expr
とその値を表示しますが、
時にはそれでは出力が多すぎることがあり、条件で絞りたい場合があります。
新構文#??=test expr
は test
が満たされた時のみ expr
を表示します。
同じように#?,
に対応する #??,
もあります。
debug-print-conditionally参照。
quasirename
により作られるリストにもソースコード情報が
付加されるようになりました。
:metric
キーワード引数を取り、どの指標で比較するか選べるようになっています。
time-these/report参照。
:string-length
で指定できます。
*load-path*
からサーチされた
場合に、実際どのファイルがロードされたかを知るのに便利です。
(これまでは、成功時にload
は#t
を返していました)。
<time>
オブジェクトの比較器を追加。
π
が使えます。
:immutable
スロットオプションを追加。
:immutable slot option参照。
gosh
: -v
オプションを拡張。 -v:0.9.12
のように
指定された場合、0.9.12が実行できなければ、警告を出した上で現在のgoshを実行します。
コロンがない場合は、指定バージョンがなければエラー終了となります。
<json-mixin>
クラスを追加。
JSONへシリアライズ可能なGaucheクラスを容易に定義できます。
:on-abnormal-exit :exit-code
オプションを指定した場合、
サブプロセスが異常終了した時にその終了コードを戻り値として得られます。
--enable-multibyte
)を
廃止することをしばらく検討してきました。utf8のみに統一する予定です。
utf8以外をconfigureで指定すると警告が出ます。utf8以外で使っている場合、
なるべく早く切り替えるようにしてください。
--enable-threads
オプションは将来廃止され、
プラットフォームに応じたスレッドシステムが自動的に選択されます。
スレッドを前提にするライブラリが増加しており、スレッドなしの場合をサポートする
意味が減ってきたのが理由です。
(read-bytevector 0)
が0でなくEOFを返していました。
Scm_SimpleMain()
を使った時の終了ステータスをスクリプトとして実行した
場合に合わせる Issue:861.
current-output-port
等を正式なパラメータに。
以前は「パラメータ的な」手続き(Gauche用語では「動的状態」)に過ぎなかったのですが、
SRFI-226互換のparameterize
はパラメータしか許さないためです。