R6RS:old
Revised^6 Report on Algorithmic Language Scheme --
アルゴリズム言語 Scheme に関する報告書第6改訂版。現在策定中の Scheme
の次期標準。
現在の draft 版(R5.91RS)は http://www.r6rs.org/ で見ることができる。
- うへぇー 142ページもある.約3倍,CLに追いつく日は近い?(2006/09/15 16:52:31 PDT)
- Shiro: 言語のコア部分は58ページですね。増えたぶんはライブラリですな。
- j-kon: 謝辞の中に"Shiro Kawai"の名がありますね。(Gaucheの活動とは別に)R6RS策定にも関わっているのですか? (2006/09/19 22:51:20 UTC)
- おおーっ!ホントだ!すご!!cut-sea:2006/09/18 18:21:11 PDT
- Shiro: あら気がつかなかった。たぶんSRFIプロセスで提出されたR6RSの機能(R6RS SRFI)についてのディスカッションに参加したからじゃないかと思います。
以下は 2006/06 版の Status Report をもとにまとめた。
概要
言語の構造
言語のコアとライブラリを分割する。
R5.91RS に挙がっているライブラリは以下の通り。
- (r6rs unicode) pp. 58-60: unicode の定義にもとづく文字・文字列処理
- (r6rs bytes) pp. 60-63: バイト列データ型
- (r6rs lists) pp. 63-65: 様々なリスト処理(find, forall, exists, filter ...)
- (r6rs records) pp. 65-72: 構造体
- (r6rs records procedural) pp. 66-69
- (r6rs records explicit) pp. 69-71
- (r6rs records implicit) pp. 71-72
- (r6rs records inspection) p. 72
- (r6rs exceptions) pp. 73-74: 例外処理 SRFI:34
- (r6rs conditions) pp. 74-78: コンディション SRFI:35
- (r6rs i/o) pp. 78-94
- (r6rs i/o primitive) pp.79-85
- (r6rs i/o ports) pp.85-93
- (r6rs i/o simple) pp.93-94: R5RS 風の IO
- (r6rs arithmetic) pp.94-
- (r6rs arithmetic fixnum) pp.96-98: 2^w を法とした fixnum 演算
- (r6rs arithmetic fx) pp.98-100: 演算結果が fixnum に収まらない場合に &implementation-restriction を投げる fixnum 演算
- (r6rs arithmetic flonum) pp.100-102: flonum 演算
- (r6rs arithmetic exact) pp.102-105: 正確な数に対する演算
- (r6rs arithmetic inexact) pp.105-107: 不正確な数に対する演算
- (r6rs syntax-case) pp.107-116: syntax-case マクロ
- (r6rs hash-table) pp.116-118: ハッシュテーブル
- (r6rs enum) pp.118-120: 列挙体
- (r6rs when-unless) p.120: when と unless
- (r6rs case-lambda) pp.120-121: case-lambda
- (r6rs promisies) pp.121-122: 遅延評価
- (r6rs scripts) p.122: command-line-arguments 手続き
- (r6rs eval) pp.122-123: eval と環境指示子
- (r6rs mutable-pairs) pp.123-125: set-car! と set-cdr!
- (r6rs r5rs) pp.125-126: R5RS 互換手続き
プログラム
R6RS のプログラムはライブラリかスクリプトの形式をとる。
ライブラリは単一のトップレベル library フォームからなり、
他のライブラリから束縛をインポートし、他のライブラリに束縛を公開する。
スクリプトはスクリプトヘッダと単一のライブラリからなる。
式や定義はすべて library フォーム中に現れなければならない。
削除された機能
- transcript-on, transcript-off
- interaction-environment
- トップレベルの定義および式
非推奨の機能
- scheme-report-environment
- null-environment
- quotient, remainder, modulo
変更点
- case-sensitive な構文
- internal define は letrec* 相当に
- 唯一固有の EOF オブジェクト
- begin のつくる継続は任意個の値を受け取る(R5RS ではオプション)
- 文字や真理値のあとの delimiter 必須
- #!r6rs syntax -- ライブラリやスクリプトが R6RS 互換の構文要素のみから成ることを宣言する。それ以外はコメントと同等に扱われる。
- 実装系は後述の #!symbol なしに構文要素を拡張してはならない
- #!symbol -- symbol が r6rs 以外の場合、実装系はエラーを通知してもよいししなくてもよい。実装系は後続の入力が標準の構文を拡張していることを示すフラグとしてこれを使うのが望ましい。
- R5RSで「未定義値」を返していた式は、eq? で比較可能な「未定義」をあらわす値を返す
- 文字・文字列比較が n-ary に(R5RS ではオプション)
- dynamic-wind の in, out の thunk は dynamic-wind の外側と解釈する。従って、継続を用いた両者への突入/脱出は in/out を起動しない
- 標準関数のほとんどは不正な入力に対して適当なコンディションで例外を投げる
- read/write invariance
- 標準的な操作でつくられたシンボル、文字列、文字には少なくともひとつ標準的な表現が存在する
- equal? は任意の入力について必ず停止する(SRFI:85 equiv? 参照)
- 実装系は Numerical Tower の全体を実装しなければならない
- 将来の拡張のための予約文字: []{}| → {}
- R進実数リテラルに <mantissa width> 追加
- #\<character name> 形式の文字リテラルで、文字名の大文字小文字を区別する
追加された機能
- 複数行コメント #|〜|#
- S-expression コメント #;
- [...] = (...)
- ->subsequent* 形式のシンボル
- eof-object 構築子
- 未定義値を返す、unspecified 手続き
- let-values, let*-values
- (define var) = (define var (unspecified))
- when, unless
- case-lambda
- call/cc(call-with-current-continuation の別名として)
- リスト処理手続き exists, forall, fold-left, fold-right, filter, partition, iota, find, remq, remv, remove, memp, remp, assp
- Unicode サポート
- Unicode の Zs, Zl, Zp も字句解析時に Whtiespace と見做される
- Unicode 文字も識別子に含めることができる
- 文字の UCS コード指定表記は \xXX と書く(cf. Gauche: \uXXXX)
- \a, \b, \t, \n 等々の escape sequence。未定義の escape sequence は不正
- #vu8(...) 形式のバイトオブジェクト外部表現
- #' #` #, #,@ 略記法
追加予定の機能
- トップレベルライブラリ → pp.20-26 Libraries
- 例外処理 → ライブラリ
- safe モードと unsafe モード → p.17 Safery, p.56 Declarations
- syntax-case マクロ → ライブラリ
- hash-table ライブラリ → ライブラリ
- byte-vector → ライブラリ
- スクリプト → pp.26-27 Scripts
- fixnum/flonum 専用の演算 → ライブラリ
- 無限と NaN のサポート → p.10 Infinities and NaNs
変更されない点
- 多値
- 手続き適用, let, letrec の評価順序不定
- set-car!, set-cdr!
- read-char, peek-char は EOF オブジェクトを返す
- (begin) は不正
- case は memq を使う
- else 節のない if
- append は最後の引き数が () であっても最後の引き数以外を複製する
- () は不正
- (make-string n) と (make-vector n) の要素は不定。特に、(make-vector n) は (unspecified) で初期化されない
R6RS 以降へ
- プロセス
- ネットワークプログラミング
- オブジェクト指向プログラミング
- box データ型
- format
- グラフ表示(write/ss etc.)
- rec
- vector-length prefix #n(...)
- gensym / uid
- EOF オブジェクトの外部構文(例: #!eof)
- 未定義値の外部構文(例: #!unspecified)
- SRFI:0 cond-expnad
- ユニフォームベクタ
- weak pointer
- 正規表現
関連
- R6RS Status Report (Jun 2006)
http://www.schemers.org/Documents/Standards/Charter/status-jun-2006/status-jun06.html
- R6RS Status Report (Mar 2006)
http://www.schemers.org/Documents/Standards/Charter/status-mar-2006.html
- The March 2005 R6RS Status Report
http://www.schemers.org/Documents/Standards/Charter/mar-2005.txt
- The Revised R6RS Status Report
http://schemers.org/Documents/Standards/Charter/2004-10-13.pdf
- R6RS SRFI
- Other related SRFIs
参考
Last modified : 2012/01/23 16:07:05 UTC