R6RS と SRFI で非互換な点


Tags: R6RS, SRFI

R6RS と SRFI には、名前が同一でありながら実体が異なり、そのまま同時に import すると例外が発生する識別子がある。ここではそれらの識別子と相違点を列挙する。

Cf. R6RS:CompatibilityNotes

SRFI 1: List Library

map, for-each, fold-right

引数として渡すリスト群の長さがすべて同じでなくてもよく、どれかひとつが有限リストであればよい。

member, assoc

省略可能な第三引数として比較手続きを取る。

remove

第一引数としてオブジェクトではなく述語を取る。

SRFI 5: A compatible let form with signatures and rest arguments

let

named-let を define に似た構文で書けるようになり、省略可能引数を扱えるようになる。

SRFI 9: Defining Record Types

define-record-type

構文が異なる。

SRFI 13: String Libraries

string->list, string-copy, string-fill!, string-titlecase, string-upcase, string-downcase

省略可能引数で操作の始点と終点を指定できる。

string-hash

省略可能な引数でハッシュ値の上限と、ハッシュ値を計算するときの始点と終点を指定できる。

string-for-each

R6RS では複数の文字列を渡せるのに対して、省略可能引数で繰返しの始点と終点を指定できる。

SRFI 17: Generalized set!

set!

set! の代入場所指定に手続き適用を指定できる。

SRFI 23: Error reporting mechanism

error

最初の引数として who を取らない。

SRFI 35: Conditions

condition

R6RS では手続きとして定義されているのに対し、 SRFI 35 ではマクロとして定義されている。

SRFI 43: Vector Library

vector-map, vector-for-each

手続きがベクタ群の各要素に加えて最初の引数にその要素の添字を取る。

vector-fill!, vector->list, list->vector

省略可能な引数で操作の始点と終点を指定できる。

SRFI 46: Basic Syntax-rules Extensions

syntax-rules

syntax-rules の構文が

(syntax-rules [<ellipsis-identifier>] (<literal-identifier> ...)
  (<pattern> <template>)
  ...)

のように拡張され、パターン言語に次のような構文が追加される。

 (<pattern> ... <ellipsis> <pattern> ...)
#(<pattern> ... <ellipsis> <pattern> ...)

SRFI 47: Array

equal?

equal? が配列に対しても働く。

SRFI 57: Records

define-record-type

構文が異なる。

SRFI 61: A more general COND clause

cond

cond の構文が

<cond clause> --->
  ...
  | (<generator> <guard> => <receiver>)

のように拡張される。

SRFI 63: Homogeneous and Heterogeneous Arrays

equal?

equal? が配列に対しても働く。

SRFI 69: Basic hash tables

string-hash, string-ci-hash

省略可能引数でハッシュ値の上限を指定することができる。

SRFI 71: LET-syntax for multiple values

let, let*, letrec

多値を扱えるように構文が拡張される。

SRFI 74: Octet-Addressed Binary Blocks

endianness

big, little, native の値のみを受け付ける。

SRFI 87: => in case clauses

case

cond 文と同様の構文で => を使いキーの値を受け渡すことができる。