Scheme入門 第8章 関数ってなんぞ?
今回は関数の話。関数って何でしょう。sin 関数とか cos 関数と言いますねぇ。とりあえず Scheme にも sin
とか cos
は用意されております。試しに使ってみます?
(display (sin 0.5))
なにやら訳の解らない数字が出てくると思いますが、とりあえず無視しときましょう。簡単に言えば、ある値を与えるとある値を吐く。こういうのが関数です。また、普通は関数とは言いませんが Scheme では + - * /
とかも関数の一種と言えます。だって書き方が同じなんだもの。
(display (+ 1 2))
引数の個数は違いますけどね。とりあえず数学で
f(x) = 2x
例えば 2 を与えると f(2) = 4 で、10を与えると f(10) = 20 というわけです。Scheme では次のように書きます。
(define (f x) (* x 2))
(* x 2)
は x
を2倍するってことでいいですね?(f x)
は、関数の名前と引数の名前を書きます。引数が3個だったら、(f x y z)
のようにします。名前は何でもいいです好きに決めてください。
これで関数 f
が使えます。早速使ってみましょう。完全なプログラムは以下のようになります。
(define (f x) (* x 2))
(display (f 2))
(newline)
(display (f 10))
(newline)
実行結果は次の通り。
4
20
ふむふむ。期待通りです。ここでは簡単な関数の例しか挙げませんが、いくらでもややこしい関数を作ることが出来ます。if なんかも入れちゃって構いませんし、作った関数を使って別の関数を作っても構わないわけです。
例えば g(x) = f(x) + 1 という関数 g
は
(define (g x) (+ (f x) 1))
と書けば良いわけです。簡単ですね?
ところで Scheme では、変数も関数も、同列に扱うことになっています。
先程定義した関数 f
ですが、(define f "Hello")
などとして変数 f に値を入れると、さっき定義した関数 f
は消え去ってしまいます。これは次のようにすると試すことが出来ます。
(define (f x) (* x 2))
(display (f 10))
(newline)
(define f "Hello")
(display (f 10))
(newline)
procedure application: expected procedure, given: "Hello"; arguments were: 10
2度目の (f 10)
のところで「手続きではないものを呼び出そうとしました:"Hello"」とか言われてしまいます。それは確かにその通り、ごもっともな指摘ですが、Lisp とは異なる仕様なので、Lisp 使いの人はお気を付けを。で、関数が他の数値とかと同列に扱っているのなら、display
で表示させたり出来るんでしょうか?もちろんそういうことも出来ますけれども・・・
(define (f x) (* x 2))
(display f)
実行すると DrScheme では次のように出ます。
#<procedure:f>
procedure は「手続き」という意味です。先程から、関数関数と連呼してきましたが、Scheme の用語では正式には「手続き」と呼びます。関数で通じるから別にいいんですけれども、一応ね。で、ここでは #<procedure:f>
と出ていますが、「 f という名前の手続き」という程度の意味でして、残念ながらさほど有益な情報は表示されません。
値が手続きかどうかは procedure?
で調べることが出来ます。
第8章・完
第9章へ
- DrScheme での Language Pack の選択
- Scheme の単純な式「(+ 3 2)」, 「(- 10 4)」
- Scheme の単純な式(括弧の入れ子)
- Scheme の単純な式 (DrScheme の定義ウインドウ)
- 関数 area-of-disk の定義と,関数適用
- 関数 area-of-disk,変数 PI の定義と,関数適用(1)
- 関数 area-of-disk,変数 PI の定義と,関数適用(2)
0 コメント:
コメントを投稿