表題

S-式コメント

著者

Taylor Campbell

状態

この SRFI は現在「確定」の状態である。 SRFI の各状態の説明については ここ を参照せよ。 この SRFI に関する議論については メーリングリストのアーカイブ を参照せよ。

概要

この SRFI では Scheme の字句文法を簡単に拡張し、 個々の S-式をコメントアウトし、 リーダが S-式を無視できるようにする。 これは Lisp 標準のセミコロン コメントと対照的である。 Lisp 標準のコメントは行末までを無視する。 SRFI 30 で定義されているようなブロック コメントもあるが、 いずれの仕組みもテキストの一部をコメントアウトするのであって、 S-式をコメントアウトするのではない。

論拠

一行コメントとブロック コメントは、プログラムにテキストでコメントを埋め込むには便利である。 しかし、コードを簡単にコメントアウトする用途には向いていない。 エディタによる支援がなければ、 S-式を構成するテキストを残したままコードから除外したり、 除外した S-式を後で復活させたりすることは、容易ではない。

非形式的な仕様

新しいリーダ文法文字 #; を定義する。 リーダは #; に続く S-式を無視し、 その次の S-式の処理に進む。 たとえば、

(+ 1 #;(* 2 3) 4) -reads-> (+ 1 4) -evals-> 5
(list 'x #;'y 'z) -reads-> (list (quote x) (quote z)) -evals-> (x z)
(* 3 4 #;(+ 1 2)) -reads-> (* 3 4) -evals-> 12
(#;sqrt abs -16) -reads-> (abs -16) -evals-> 16

S-式のコメントをネストさせると、最初は混乱するかも知れないが、 率直に説明しておこう。 例として (list 'a #; #;'b 'c 'd) というテキストを考えてみよう。 これを読み取ると (list (quote a) (quote d)) のようなリストになる。 'b'c はともに削除されることに注意してほしい。 理由は簡単だ。最初の #; はリーダが次の S-式を読み飛ばすように促す。 このとき、リーダは2つめの #; に遭遇するが、これにより 'b が読み飛ばされる。次にリーダーは 'c に進み、これが最初の #; に続く S-式となるので、これも読み飛ばされる。 そして最後の 'd だけが読み取られる。

これはネストされた S-式コメントの非常に特殊なケースである。 もう少し簡単な例を挙げよう。

(list 'a #;(list 'b #;c 'd) 'e) -reads-> (list (quote a) (quote e)) -evals-> (a e)

別の奇妙な例、ドット付きリストの例を挙げよう。

'(a . #;b c) -reads-> (quote (a . c))
'(a . b #;c) -reads-> (quote (a . b))

しかし、S-式コメントを削除した後で不正なテキストはやはり不正であるし、 S-式コメントのプレフィックス #; の後ろには完全な S-式を記述しなければならない (そしてその後ろには完全な S-式か、閉じ括弧、ドット付きリスト内のドット、ファイル終端 のような特殊なトークンを記述しなければならない)。 たとえば、以下の例はすべてエラーである。

形式的な仕様

R5RS の形式文法を以下のように修正する。

<commented datum> 内の最初の datum は意味論的に無視される。 同様に、<delimiter prefix> 内の #; トークンに続く datum も意味論的に無視される。

上記の修正を施した文法規則を以下に示す。
  7.1.1:

    <token> ---> <identifier> | <boolean> | <number>
        | <character> | <string>
        | "(" | ")" | "#(" | "'" | "`" | "," | ",@" | "." | "#;"

  7.1.2:

    <datum> ---> <simple datum> | <compound datum>
        | <commented datum>
    <commented datum> ---> "#;" <datum> <datum>
    <list> ---> "(" <datum>* <optional dot> <delimiter prefix> ")"
    <vector> ---> "#(" <datum>* <delimiter prefix> ")"
    <optional dot> ---> <empty> | <datum> <delimiter prefix> "." <datum>
    <delimiter prefix> ---> <empty> | "#;" <datum> <delimiter prefix>

著作権

Copyright (C) 2004 Taylor Campbell. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


編集者: Mike Sperber