第6回 Scheme 入門(5月25日)

今日の課題

■ 関数型言語 scheme

scheme は関数型言語 lisp の方言の一つである.

関数型言語では,「<式>を<評価>して,<返り値>を得る」という計算を基本とする.

■ DrScheme の環境と操作

知能情報工学科の計算機には,DrScheme がインストールされている. DrScheme は,Scheme のプログラミング環境の一種である. ここがDrSchemeのホームページである:http://www.drscheme.org/ Windows 用もある.以下に主な操作方法を示す.
起動方法 コンソール上で drscheme とする
ウインドウ デフォルトでは幾つかのボタンと2つの白いエリアがある
上のエリア:式を定義するエリア (Definitions)
下のエリア:対話的に式を評価(実行)するエリア (Interactions)
メニューの中の「View」の中の項目を操作することでウインドウの設定が可能※1
マニュアル メニューの中の「Help」の中の「Help Desk」より検索が可能
プログラムの作成 Definitions に書き込む
プログラムの実行 Run ボタンを押した後,Interactions で,式を入力する(たとえば,関数に具体的な値を与える)
プログラムの保存 メニューの中の「File」の中の「Save Definitions」を選択する
プログラムの読み込み メニューの中の「File」の中の「Open」を選択する
終了方法 メニューの中の「File」の中の「Quit」を選択する

※ Interactions を表示するには,「メニュー」の中の「View」の中の「Show Interactions」を選択する.

■ データ

scheme で使用する主なデータを紹介する:

■ 式(フォーム)

直感的にいえば,式は次の2通りがある.

引数を要するときは,括弧付きの書式となる.引数には,データだけでなく式も与えることができる.

■ 評価

Interactions 上に,式を入力して,Enterキーを押す.

例題1

データだけの式を評価してみよう.
> 100    ⇒ 100 が返り値となる
> 3/4    ⇒ 分数を評価すると,実数が返り値となる3/4が返り値となるが,
               Languageの選択によっては実数で返り値が表示される
               (#iという先頭の2文字は,近似値であることを表す).
> pi     ⇒ 組み込みの定数 pi を評価すると,実数が返り値となる.
               Languageの選択によっては,pi は組み込みの定数ではない.

例題2

簡単な式を評価してみよう.
> (- 5)    ⇒ 単項演算
> (+ 1 2)   ⇒ 2項演算
> (sqrt 2)   ⇒ 組み込み関数
> (sin (/ pi 2)) ⇒ 引数部に式を与えている.数学の記法でいは,sin(π/2) のこと.

■ 定数の定義

定数の定義は,Definitions で defineを使う.書式は以下のとおりである.
(define <名前> <式>)

例題3

果物の名前と価格を定義し,その名前を使って,果物の代金を計算しよう.

価格は次のように設定する.

apple 110
orange 90
pineapple 230
peach 190

例として,apple 3つ,orange 5つ,pineapple 1 つ,peach 5つの場合を計算しよう.

  1. Definitions で入力
    (define apple 110)
    (define orange 90)
    (define pineapple 230)
    (define peach 190)
    
  2. Runボタンを押す
  3. Interactions で評価
    > (+ (* apple 3) (* orange 5) (* pineapple 1) (* peach 5))
    

上記の定数の定義をファイル「prac0601.scm」に保存してみよう.また,いったんdrscheme を終了し,再び起動して,定義ファイルを開いてみよう.

練習1

例題3の続きとする.贈り物用のフルーツセット(giftbox)には,メロンが1つ,林檎が5つ,オレンジが3つ入っている.メロンは単価が 800 円とする.giftbox の代金は,入っている果物の値段と箱代(box)50円の合計とする.giftbox の代金を定義しよう.

お得用フルーツセット(specialbox)には,1割引の桃が3つ,定価のパイナップルが1つ,2割引のオレンジが5つ入っている.specialbox の代金はそれらの果物の値段の和として箱代はサービスとする.specialbox の代金を定義しよう.

以上の定義を prac0602.scm に保存しよう.

■ 簡単な関数の定義

関数の定義は,以下の書式で行う.
(define <名前> (lambda (<引数名>  <引数名> …) 式の並び))

例題4

簡単な式を定義してみよう.

  1. Definitions で入力
    (define square (lambda (x) (* x x)))
    (define increment (lambda (x) (+ x 1)))
    
  2. Runボタンを押す
  3. Interactions で評価
    > (square 5)  ⇒ 関数 square では 5 * 5 を計算
    > (increment 4)  ⇒ 関数 increment では 4 + 1 を計算
    > (square (increment 4)) ⇒ 4 + 1 を先に計算
    > (increment (square 4)) ⇒ 4 * 4 を先に計算
    

練習2

次の式を計算するための関数を定義せよ.以下を prac0603.scm としてセーブしよう.

  1. f(x) = x2 + 5 x + 6
  2. g(x) = (x + 2)(x + 3)
  3. d(a,b,c) = ax2 + bx +c が実数解を持つかどうかの判別式
  4. s(a,b,t) = 2辺の長さ a,b で,それらのなす角が t である三角形の面積.ただし,t は degree で入力されるものとする.
  5. heron(a,b,c) = 3辺の長さが a b c である三角形の面積をヘロンの公式で求める.
    ※ ヘロンの公式:s = (a + b + c)/2 とするとき,三角形の面積は sqrt(s * (s - a) * (s - b) * (s - c)) である.


(c) 2006.5.24 by tokuhisa