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

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

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

Scheme の構文は三段階で構成される。

  1. プログラムのテキストがどのように語彙素に分割されるのかを説明する字句構文
  2. 字句構文により定式化され、語彙素の並びを構文データの並びとして構造化するデータ構文(ここで、構文データは再帰的に構造化された実体である)
  3. データ構文により定式化され、追加的な構造を付加し、構文データに意味を付与するプログラム構文

構文データ(外部表現とも呼ばれる)はオブジェクトの記法としてふたつの役割をし、そして、 Scheme の (rnrs io ports(6)) ライブラリ(R6RS:翻訳:Standard Libraries:8.2 Port I/O)は構文データの読み書きに get-datum 手続きと put-datum 手続きを提供し、それらのテキスト表現と構文データを相互に変換する。各構文データは対応するデータ値を表す。構文データはプログラム中で quote を使って対応するデータ値を手に入れるのに使うことができる(R6RS:翻訳:R6RS:11.4 Expressions の 11.4.1 節参照)。

Scheme のソースコードは構文データと(重要ではない)コメントから成る。ソースコード中の構文データはフォームと呼ばれる(他のフォームの内側に入れ子になっているフォームは下位フォームと呼ばれる)。 Scheme の構文には、フォームである何らかの文字の並びはまた、何らかのオブジェクトを表す構文データでもある、という性質がある。これは混乱を招くかもしれない。文脈を離れた場合、与えられた文字の並びがオブジェクトの表現を意図しているのかプログラムのテキストを意図しているのか明らかではないからである。これはまた力の源でもある。これは解釈系や翻訳系のようなプログラムをオブジェクト(か、またはその逆)として扱うプログラムを書く役に立つからである。

データ値には複数の異なる外部表現が存在することがある。例えば、「#e28.00」と「#x1c」は正確な整数オブジェクト 28 を表す構文データであり、「(8 13)」、「( 08 13 )」、「(8 . (13 . ()))」はすべて正確な整数オブジェクト 8 と13 を格納したリストを表す構文データである。(equal? の意味で――R6RS:翻訳:R6RS:11.5 Equivalence predicates 参照)同値なオブジェクトを表す構文データは常にプログラムのフォームとして等価である。

構文データとデータ値が緊密に対応しているため、本報告書では、正確な意味が文脈から明らかな場合には、データという用語を構文データにもデータ値にも使うことがある。

実装系はひとつの例外を除いて決して字句構文とデータ構文を拡張してはならない。 #!<identifier> という構文について、 <identifier> が r6rs でない任意の識別子(R6RS:翻訳:R6RS:4.2 Lexical syntax の 4.2.4 節参照)を、構文違反として扱う必要はなく、特定の #! を接頭辞とする識別子を、入力の後続の部分が標準の字句構文やデータ構文への拡張を含んでいることを示すフラグとして使ってもよい。 #!r6rs 構文は後に続く入力が本報告書で述べられている字句構文とデータ構文で書かれていることを示すのに使うことができる。 #!r6rs はそれ以外はコメントとして扱われる。R6RS:翻訳:R6RS:4.2 Lexical syntax の 4.2.3 節を参照。


Last modified : 2008/05/05 10:14:31 UTC