変数・関数
変数とは,様々なデータを格納しておく場所のことで,変数名によって識別される. 変数にデータを格納することを代入するという. 新しい変数を用意する(定義する)にはdefineを用いる.
> (define x 3) x > x 3 > (+ x 3) 6 > (define y (* x 5)) y > y 15変数の値を変更するには,set!を用いる.
> x 3 > (set! x (+ x 3)) 6 > x 6
関数とその定義
関数とは,いくつかのデータ(数値,文字列など)を使って,ある計算を行い,その結果を求める一連の作業をまとめたものである.関数へ渡すデータを引数という.求められた結果を関数の値という. Schemeでは,新しい関数を用意する(定義する)場合にも,変数の定義と同様に,defineを用いる.
> (define (plus x y) (+ x y)) plus関数への引数は,変数で表現する.関数の本体は,その変数を使って定義される. 上の例のplusは,x,yという二つの引数をとって,その和を値とする関数である. この関数の定義に用いられる引数のことを正式には仮引数という.
関数を使用することを,一般に関数を呼び出すという. また関数呼出しの際に関数に与えられる引数のことを実引数といい,仮引数と区別する. 例えば,上の関数plusのxとyは仮引数であって,この関数が,
> (plus 3 4) 7のように呼び出されるとき,3,4が実引数である.
仮引数は,関数に実引数が渡されたときに,それぞれの引数を関数の本体の式でどのような名前で参照するかを決めるものであって,仮引数の名前自体は,どのようなものでもよいし,予め定義されていなくてもよい. たとえば関数plusを,
> (define (plus first-arg second-arg) (+ first-arg second-arg)) plusと定義しても,
> (define (plus x y) (+ x y)) plusと全く同じで,第一の引数と第二の引数の和が関数の値となる.
引数に使われる変数は,関数の中でのみ参照することができる変数であり,局所変数と呼ばれる.
> (define (plus first-arg second-arg) (+ first-arg second-arg)) plus > (plus 1 6) ;; 関数内部での動き ;; first-argに1を代入 ;; second-argに6を代入 ;; (+ first-arg second-arg)を評価する.結果は,7 7 > first-arg ==> error ;; first-argは関数plus内部のみで有効であり,外部では利用できない.それに対して,
> (define y 10) yのように,トップレベルで定義される変数は大域変数と呼ばれ,どこからでも参照できる. 変数(関数の)有効範囲の詳細については,ここを参照のこと.
変数名・関数名には,Schemeの予約語および'( )'など特殊な例を除けば,ほとんどの文字を使うことができる. 数字を名前の先頭に使うことも可能(処理系依存).
> (define &x -10) &x > &x -10 > (define 8&x (* &x 8)) 8&x > 8&x -80
Schemeでは,条件判定の関数名には,最後に'?'をつけるのが慣例である.
;; 二つの式が同等かどうかの判定 > (equal? (+ 1 2) (- 5 2)) #t ;; True(真.正しいという意味.この場合 1+2 = 5-2 = 3) ;; 二つの文字列の辞書式順序の比較 > (string<? "cons" "append") #f ;; False(偽.誤りという意味.この場合,辞書式順序で,"cons" > "append")また何かを変換する関数の名前には,'->'をつかう.
;; 文字列を数値に変換 > (define x (string->number "124")) x > (equal? x 124) #t