高校数学の窓過去問検索

Scheme入門 第8章 関数ってなんぞ?


今回は関数の話。関数って何でしょう。sin 関数とか cos 関数と言いますねぇ。とりあえず Scheme にも sin とか cos は用意されております。試しに使ってみます?





(display (sin 0.5))






なにやら訳の解らない数字が出てくると思いますが、とりあえず無視しときましょう。簡単に言えば、ある値を与えるとある値を吐く。こういうのが関数です。また、普通は関数とは言いませんが Scheme では + - * / とかも関数の一種と言えます。だって書き方が同じなんだもの。





(display (+ 1 2))




引数の個数は違いますけどね。とりあえず数学で f(x) = … と書くようなものは関数です。引数が2個だったら f(x,y) = … ですかね。こういった関数を、自分で定義することが出来ます。例えば、そうですね、次のような簡単な関数を Scheme で書いてみることにしましょう。





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






  1. DrScheme での Language Pack の選択

  2. Scheme の単純な式「(+ 3 2)」, 「(- 10 4)」

  3. Scheme の単純な式(括弧の入れ子)

  4. Scheme の単純な式 (DrScheme の定義ウインドウ)

  5. 関数 area-of-disk の定義と,関数適用

  6. 関数 area-of-disk,変数 PI の定義と,関数適用(1)

  7. 関数 area-of-disk,変数 PI の定義と,関数適用(2)


0 コメント: