[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 大文字小文字の区別

Lisp系の言語は歴史的にシンボルの大文字小文字を区別していませんでした。 Schemeもその流れを汲んでおり、R5RSでもシンボルは読み込まれる時に大文字小文字の 区別をしないと定義されています。(但し、R5RSの範囲内でも処理系内部では 大文字小文字を区別することになってます。 ここで問題としているのは読み込み時の動作です。)

しかし現在では、プログラミングが一つの言語で完結することは滅多にありません。 他の言語とインタフェースを取る場合、Scheme側でも大文字小文字を区別するように しておいた方が便利です。

そこでGaucheでは、シンボルの読み込みと書き出しに2つのモードを用意しました。 デフォルトのモードでは、Gaucheのリーダとライタはシンボルの大文字小文字を区別します。 このふるまいは厳密にはR5RSに準拠しません。

 
; In case-sensitive mode (default)
(eq? 'a 'A) ⇒ #f  ; #t in R5RS
(symbol->string 'ABC) ⇒ "ABC"
(symbol->string 'abc) ⇒ "abc"
(display (string->symbol "ABC")) ⇒ writes ABC
(display (string->symbol "abc")) ⇒ writes abc

goshインタプリタの起動時に-fcase-foldコマンドライン引数を 与えると、Gaucheは大文字小文字を区別しないモードで動作します (Gaucheを起動する参照)。 このモードでは、リーダはシンボルの読み込みの際に大文字を小文字に変換します。 大文字を含んでいるシンボルに関しては、`|' 文字でエスケープされて書き出されます (シンボル参照)。

 
; In case-insensitive mode (with -fcase-fold option)
(eq? 'a 'A) ⇒ #t
(symbol->string 'ABC) ⇒ "abc"
(symbol->string 'abc) ⇒ "abc"
(display (string->symbol "ABC")) ⇒ writes |ABC|
(display (string->symbol "abc")) ⇒ writes abc

また、リーダはトークン#!fold-caseを読むと大文字小文字を 区別しないモードに切り替わります。トークン#!no-fold-caseは その逆の効果、すなわち大文字小文字を区別するモードへと切り替えます。 これらのトークンは、それが読まれたポートからの以降の読み込みに影響を 与えます。切り替えるトークンが再び読まれるか、EOFに出会うまで影響は継続します。 #!構文についてより詳しくは字句構造を参照してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.