srfi minus 30 at srfi dot schemers dot org
宛てにメールしてほしい。
このメーリングリストに参加するには
ここ を参照せよ。
この SRFI の確定前の議論については
メーリングリストのアーカイブ を参照せよ。
この SRFI の確定後の議論については
メーリングリストのアーカイブ を参照せよ。
SRFI 22 では、ファイルの先頭にだけ許される複数行コメントを定義している。
SRFI 10 では、将来の SRFI で読み書き可能な値が導入されるときに使う
"#" <discriminator> <other-char>*という記法を提案している。
この SRFI では、R5RS を拡張し、
ネスト可能な複数行コメントを導入する。
複数行コメントは #|
で始まり
|#
で終わる。
複数行コメントは、多くのプログラミング言語で普通に使われている。 複数行コメントを使うと、プログラムの中にテキスト ブロックを追加することができるので、 不完全なコードを隠したり代替の実装を記述したりすることで、 開発がしやすくなる。
複数行コメントの構文として #|
... |#
を採用した理由は、
この構文がすでに広く使われているし
(Chez Scheme, Chicken, Gambit-C, Kawa, MIT Scheme, MzScheme, RScheme)、
この構文が R5RS にうまく適合するからである。
ネスト可能なコメントは、
徐々にコードをコメント アウトしていくような作業を行うときに重要な機能となる。
この SRFI は、コメントの仕様 (R5RS 2.2 節) を以下のように拡張する。
シーケンス #|
は複数行コメントの始まりを表す。
複数行コメントは |#
が現れるまで続く。
終わりの |#
が存在しない場合はエラーが発生する。
Scheme は複数行コメントを 1 つの空白として解釈する。
複数行コメントはネストしてよい。
コメントの中に #|
があると、
それは新しい複数行コメントの始まりとなり、
それに対応する |#
で終わらなければならない。
この SRFI は、
R5RS
7.1.1 節
の字句構造の仕様における <comment>
の生成規則を次のように拡張する。
<comment> ---> ; <改行までの後続のすべての文字> | #| <comment-text> (<comment> <comment-text>)* |# <comment-text> ---> < #| や |# を含まない文字シーケンス>
<delimiter>
と #
この SRFI では、
R5RS 7.1.1 節
の <delimiter>
の仕様は拡張しない。
したがって、暗黙の終端を必要とするトークン
(識別子、数値、文字、ドット) と
複数行コメントの間を、
R5RS の <delimiter>
で分離することが必要である。
論拠:
<delimiter>
を拡張して #|
を含めると、
#
を識別子を構成する有効な文字として認識する
既存の実装との互換性がなくなってしまう。
以下に示す手続き skip-comment
は、
カレント入力ポートから最初の複数行コメントを削除する。
オプション引数には、呼び出し側がカレント入力ポートからコメントの開始文字 (#|)
をすでに削除しているかどうかを指定する。
シンボル start
は、呼び出し側は何も削除していないことを意味する。
シンボル read-sharp
は、呼び出し側が # を削除していることを意味する。
シンボル read-bar
は、呼び出し側が #|
を削除していることを意味する。
(define (skip-comment! . maybe-start-state) (let lp ((state (if (null? maybe-start-state) 'start (car maybe-start-state))) (nested-level 0)) (define (next-char) (let ((c (read-char))) (if (eof-object? c) (error "EOF inside block comment -- #| missing a closing |#") c))) (case state ((start) (case (next-char) ((#\|) (lp 'read-bar nested-level)) ((#\#) (lp 'read-sharp nested-level)) (else (lp 'start nested-level)))) ((read-bar) (case (next-char) ((#\#) (if (> nested-level 1) (lp 'start (- nested-level 1)))) (else (lp 'start nested-level)))) ((read-sharp) (case (next-char) ((#\|) (lp 'start (+ nested-level 1))) (else (lp 'start nested-level)))))))
ネストされた複数行コメントを削除する
SRFI 22 準拠のスクリプトが、
http://srfi.schemers.org/srfi-30/remove-srfi30-comments-script.scm
から入手できる。
このスクリプトは、ネストされた複数行コメントを含む Scheme
プログラムを標準入力から読み取り、
コメントを削除して標準出力に出力する。
このスクリプトは Scheme 48 のリーダーを模倣しており、
SRFI 23
の error
手続きを使用している。
多くの Scheme 実装がすでにこの SRFI をサポートしている。
Chez Scheme, Chicken, Gambit-C, Kawa, MIT Scheme, MzScheme,
RScheme などである。
Bigloo は #!
/!#
を使用した複数行コメントをサポートしている。
主要な Scheme 実装の中では、
Scheme 48 と Guile はまだこの SRFI をサポートしていない。
Copyright (C) Martin Gasbichler (2002). 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.