Kahua
- 本家
- KahuaSeminar (臨時)
- 実験室
News
- ド素人とKahua (2007-07-04 13:58:34(+0900))
- Kahua Wish List (2006-09-28 06:48:12(+0900))
- Kahua Bug (2006-11-22 07:51:39(+0900))
- 日誌 (2007-07-04 14:00:20(+0900))
- Enjoy Gauche (2007-07-04 13:59:46(+0900))
Site Info
Kahua開発日記
Enjoy Gauche
7. データ
プログラムの対象になるオブジェクトのことをデータといいます。 Gauche で扱えるデータにはいろいろな種類があります。
- 単純な型のデータ
- 論理値
- 数値
- 文字
- シンボル
- 合成データ型のデータ
- 文字列
- ベクタ
- 対とリスト
などなどです。(もちろん、これで全てではありません。) この章では比較的(説明の)簡単だと思われる単純な型のデータについて説明します。 合成データ型のデータについては別の章で説明する予定です。
7.1. 論理値
真あるいは偽をあらわす値です。真を表す値は #t、偽を表す値は #f です。
7.1.1. 論理値に関する述語
データが論理値であるかどうかをチェックする述語関数に以下のものがあります。 述語関数を適用したときの返り値は、当然、論理値です。
gosh> (boolean? #t) #t gosh> (boolean? #t) #t gosh> (boolean? 1) #f gosh> (boolean? (boolean? 3.1)) #t
7.1.2. not 関数
not 関数は、引数の論理値を否定します。
gosh> (not #t) #f gosh> (not #f) #t
Scheme には変な(便利な?)ところがあって、論理値の必要なところで、#f 以外の データがあると、それを #t と「看倣す」というのです。
gosh> (not 3) #f gosh> (not 0) #f
上の二つ目に注意してください。Scheme では数値の 0 は、#t と看倣します。
7.2. 数値
Gauche は3つのタイプの数値をサポートしています。
- 正確(exact)な整数
メモリの許す限りの精度で扱えます
- 不正確(inexact)な実数
通常IEEE 64bit浮動小数点数です
- 不正確(inexact)な複素数
実部と虚部はそれぞれ上のinexact実数です
7.2.1. 数値に関する述語
データが数値であるかどうかなどを調べるための述語関数には以下のものがあります。
- number?
- integer?
- real?
- complex?
それぞれ、数値か?、整数か?、実数か?、複素数か?という述語です。
gosh> (number? 1) #t gosh> (number? 2.5) #t gosh> (number? -6+1.2i) #t gosh> (complex? 3+4i) #t gosh> (complex? 3) #t gosh> (real? 3) #t gosh> (real? -2.5+0.0i) #t gosh> (integer? 3+0i) #t gosh> (integer? 3.0) #t
7.2.2. 比較演算
数値が同じ値かどうか比較するには、= を使います。
gosh> (= 2 2) #t gosh> (= 2 3) #f gosh> (= 2 2.0) #t gosh> (= 2 2.0+0i) #t
= は3つ以上の引数を取ることができ、その場合には与えられた引数の全てが 等しいかどうかをチェックします。
gosh> (= 3 3.0 3.0+0.0i) #t
数値の大小比較には、<、<=、>、>= という関数が使えます。 ただし、real? を適用すると #t になるような数値に関してだけ使えます。
これらの関数も、3つ以上の引数を取ることが可能で、その場合それぞれの引数が あたえられた順で、それぞれ、単調増加、単調非減少、単調減少、単調非増加 している場合に#tを返します。
7.3. 文字
Gauche では文字データは、接頭辞 #\ の後に文字名を書くことで表現します。
いわゆる半角英数字は、その文字そのものが、文字名です。 たとえば、#\a と書けば、これは文字 a のことです。
また、プログラムテキストの文字エンコーディングがGaucheの内部エンコーディングで 書かれていれば、#\ の後に文字を書けば、その文字のデータになります。
gosh> (define a #\あ) a gosh> (print a) あ #<undef>
7.3.1. 文字に関する述語
- 文字データかどうかを判定する
char?
gosh> (char? 1) #f gosh> (char? #\a) #t gosh> (char? #\愛) #t
7.3.2. 文字の比較
- 文字の比較
char=?、char<?、char<=?、char>?、char>=?
gosh> (char=? #\x41 #\A) #t gosh> (char=? #\a #\A) #f gosh> (char<? #\a #\B) #f
- 文字の比較(大文字小文字を区別しない)
char-ci=?、char-ci<?、char-ci<=?、char-ci>?、char-ci>=?
gosh> (char-ci=? #\x41 #\x61) #t gosh> (char-ci=? #\A #\a) #t
(注意)ASCII文字の範囲外における大文字小文字の扱いがきちんと定義されていません。
7.3.3. 文字の種類に関する述語
以下の述語は、ASCII文字の範囲でのみ動作し、それ以外については、#f を返します。
- ASCII文字の英字
char-alphabetic?
gosh> (char-alphabetic? #\a) #t gosh> (char-alphabetic? #\0) #f
- 数字([0-9])
char-numeric?
gosh> (char-numeric? #\a) #f gosh> (char-numeric? #\0) #t
- 白空白文字
char-whitespace?
(char-whitespace? #\space) #t gosh> (char-whitespace? #\tab) #t gosh> (char-whitespace? #\ ) ;; 全角空白 #f
- 小文字
char-lower-case?
gosh> (char-lower-case? #\a) #t gosh> (char-lower-case? #\A) #f gosh> (char-lower-case? #\a) ;; 全角「a」 #f
- 大文字
char-upper-case?
gosh> (char-lower-case? #\A) #t gosh> (char-lower-case? #\a) #f gosh> (char-lower-case? #\A) ;; 全角「A」 #f
7.4. シンボル
シンボルというのは、変数「名」のような識別子になる記号のことを言います。 通常のプログラミング言語では、このような意味でのシンボルは計算の対象では ありません。しかし、Gauche ではこのような意味でのシンボルも計算の対象に なります。計算の対象になるオブジェクトのことを、第一級(first-class)の オブジェクトといいます。シンボルが第一級のオブジェクトであるのは、 Scheme (というより Lisp)の伝統です。
gosh> (define foo (+ 1 2)) foo
Gauche では、(define foo (+ 1 2)) の値として返ってきているデータが、 シンボル foo です(define のこの動作は Scheme の仕様には規定されていません)。
7.4.1. クウォート
先に define した foo をインタープリタに入力すると、インタープリタは、これを 変数とみなし、それを評価して、シンボル foo に束縛された「値」を表示します。
gosh> foo 3
インタープリタに変数と解釈されないようなシンボル指定するには、シンボルを 「クウォート」する必要があります。
gosh> (quote foo) foo
これには、簡略記法が用意されていて、'(アポストロフィ)を使います。
gosh> 'foo foo
7.4.2. シンボルに関する述語
- シンボルかどうか
symbol?
gosh> (define foo (+ 1 2)) foo gosh> foo 3 gosh> (symbol? foo) #f gosh> (symbol? (define bar (* 2 3))) #t gosh> bar 6 gosh> (symbol? bar) #f gosh> (define hoge (define hage (- 5 3))) hoge gosh> hage 2 gosh> (symbol? hage) #f gosh> hoge hage gosh> (symbol? hoge) #t