R6RS:翻訳:Rationale:Lexical syntax and datum syntax

R6RS:翻訳:Rationale:Lexical syntax and datum syntax

4 字句構文とデータの構文

4.1 シンボルと識別子の構文

4.1.1 シンボルのエスケープ

シンボルと識別子の構文を変更したのは、編者たちがシンボルを write/read invariance に従わせる、すなわち例えば、put-datum (「文字出力」の節)や write (「簡易入出力」の節)による書き出しと、get-datum (「文字入力」の節)や read (「簡易入出力」の節)による読み出しとに対称性を持たせ、それにより同一のシンボルを生成させるためであった。Revised^5 Report on the Algorithmic Language Scheme では、シンボルは空白のような任意の文字を含むことができる一方で、それを外部表現に含めることはできなかった。またさらに、内部的にはシンボルの大文字・小文字を区別していたにもかかわらず、外部表現ではそれを区別していなかった。

本報告書では、シンボル中の特別な文字を表現するのに \x エスケープ構文を導入した。これにより、任意の Unicode のスカラー値を指定することができるようになった。これによりまた、任意のシンボルを ASCII で表現し、ASCII や Unicode の部分集合に制約されたプログラムから参照することができるようにもなるのである。

既存の処理系では、Common Lisp と同様の、|~| を使いシンボル中の文字集合を拡張する方法が主流であった。しかし、Common Lisp の |~| 記法には連続した語彙素の構文を曖昧にするという問題点があり、かつまた、ASCII の範囲の任意の文字しか表現することができないという問題があった。これは、R6RS に適合しない。

4.1.2 大文字・小文字の区別

大文字・小文字の区別をするようになったのは R5RS からの大きな変更点である。大文字・小文字を区別するにせよしないにせよ、どちらにも技術的な論拠は多数あり、それをすべてここに挙げるのは現実的ではない。

編集者達が大文字・小文字を区別するように決定したのは、Scheme コミュニュティに大多数がこの変更に賛成していると認識したからである。この認識は 2004 年の Scheme workshop や plt-scheme の ML、r6rs-discuss ML での投票により、より強固なものとなった。

付録の「大文字・小文字の区別の選択」で提案されている指定を使えば、プログラムコードの一部(ないしはその他の構文データ)は昔ながらの大文字・小文字を区別しない方法で書くことができるようになり、読み込み時に大文字・小文字が変換されなければならないようになる。

4.1.3 -> で始まる識別子

R6RS では -> で始まる識別子の字句構文に特別の規則を導入した。R5RS ではこのような語彙素は正当なものではなかった(R5RS では、- 以外の - で始まる語彙素は数値オブジェクトの表現でなければならなかった)。ただし、既存の処理系の多くは R6RS 以前から -> で始まる識別子をサポートしていた(さらに、読み込み器の多くは - で始まり、string->number が #f を返すような語彙素を識別子に分類していた)。結果として、これ以外の点では可搬性のある相当数のコードが -> で始まる語彙素(これは、特定の名前の選択として便利であった)を使用していた。ために、R6RS ではこれらの識別子を正当なものと認めることにした。文法に例外を設けるのは特にエレガントさを欠くことである。だがしかし、よりエレガントで、かつ、数値オブジェクトや他の語彙素と重複しない規則を設けるのは驚異的に難しいことが証明されているのである。

4.2 コメント

R5RS ではコメントの構文として ; だけが提供されていたのに対して、本報告書ではコメントの形式についてみっつ述べる。; に加えて、#|~|# 形式のブロックコメントと、#; で始まる「データコメント」である(#!r6rs も一種のコメントであるが、これには特定の固定した意味がある)。

ブロックコメントは複数行コメントを書くための便法であり、言語拡張としてしばしば希望され、しばしば実装されている。

データコメントは常にちょうどひとつのデータだけをコメントアウトする。これはほかの形式では確実には実現できないようなことである。さらにこれにより、特定の条件下においてのみ必要になるフォームや、あるフォームの代わりになるようなフォームをコメントアウトすることもできる。データコメントはおそらく開発やデバグの過程でもっとも便利なものであり、プログラムの最終版にはあまり現れないかもしれない。そうであったとしても、プログラマ(達)が単一のプログラムを複数のシステムで平行して開発し、デバグを行う場合、この記法が便利なこともあると考える。

4.3 将来的な拡張

# は様々な異なる構文要素の接頭辞として使われている。すなわち、ベクタ、バイトベクタ、構文の構築のための省略記法構文、入れ子になったコメント、文字、#!r6rs、それから、#! で始まる処理系の独自拡張である。どの場合も、# に続く文字がどのような構文データが後に現れるかを指定する。バイトベクタの場合では、R6RS では一種類しか規定されていないが、様々な種類の一様型ベクタがあることを予期してこれを決定している。#v の後ろの u8 は、ベクタの要素が符号なし 8 bit の要素かオクテットであることを示しているのである。

More ...