scheme は関数型言語 lisp の方言の一つである.
関数型言語では,「<式>を<評価>して,<返り値>を得る」という計算を基本とする.
知能情報工学科の計算機には,DrScheme がインストールされている. DrScheme は,Scheme のプログラミング環境の一種である. ここがDrSchemeのホームページである:http://www.drscheme.org/ Windows用もある.
以下に主な操作方法を示す.
起動方法 | コンソール上で |
---|---|
ウインドウ | デフォルトでは幾つかのボタンと2つの白いエリアがある |
上のエリア:式を定義するエリア (Definitions) | |
下のエリア:対話的に式を評価(実行)するエリア (Interactions) | |
メニューの中の「View」の中の項目を操作することでウインドウの設定が可能※1 | |
マニュアル | メニューの中の「Help」の中の「Help Desk」より検索が可能 |
プログラムの作成 | Definitions に書き込む |
プログラムの実行 | Run ボタンを押した後,Interactions で,式を入力する(たとえば,関数に具体的な値を与える) |
プログラムの保存 | メニューの中の「File」の中の「Save Definitions」を選択する |
プログラムの読み込み | メニューの中の「File」の中の「Open」を選択する |
終了方法 | メニューの中の「File」の中の「Quit」を選択する |
※ Interactions を表示するには,「メニュー」の中の「View」の中の「Show Interactions」を選択する.
DrScheme は習熟度に合せたプログラミングができるような配慮がされている.これからの演習では,「Standard」のレベルで演習を進めるので,以下の操作をしておくこと.
式には次の種類がある:
評価のしかた:Interactions 上に,式を入力して,Enterキーを押す.
「データ」の評価,「手続きの呼出し」の評価,「ラムダ式」の評価について例題を見ながら理解しよう.なお,「条件式」と「代入式」の評価については,別の回で演習する.
scheme で使用する主なデータを紹介する:
「データ」の式を評価してみよう.
> 100 ⇒ 100 が返り値となる > 3/4 ⇒ 分数を評価すると,3/4が返り値となる. Languageの選択によっては実数で返り値が表示される. |
scheme での手続きの呼出しは次の形式である:
(〈関数名〉 〈引数1〉 〈引数2〉 〈引数3〉…) |
関数名を先頭に置く形式を「前置記法」あるいは「逆ポーランド記法」と呼ぶ.通常,みなさんが数学の四則演算で使っている記法は,「中置記法」であり,演算子が引数の間に置かれている.
「手続きの呼出し」の式を評価してみよう.
> (- 5) ⇒ 単項演算 > (+ 1 2) ⇒ 2項演算 > (sqrt 2) ⇒ 組み込み関数.√2 のこと. > (+ (* 2 3) 4) ⇒ 中置記法では「 2 * 3 + 4」 > (* (+ 1 2) (- 3 (/ 4 5))) ⇒ 中置記法では「(1 + 2) * (3 - 4 / 5)」 > (sin (/ 3.141592653589793 2)) ⇒ 引数部に式を与えている.数学の記法では,sin(π/2) のこと. |
例題2では,式の中に変数が無かった.変数を使った式を作りたいときには「ラムダ式」を使う.
ラムダ式は次の形式である:
(lambda (〈引数1〉 〈引数2〉 〈引数3〉…) 〈式a〉 〈式b〉…) |
〈引数〉のところに使用する変数を記入する.〈式〉ではその変数を使うことができる.
「ラムダ式」である式を評価してみよう.
> (lambda (x) (* x 2)) > ((lambda (x) (* x 2)) 3) |
どちらの行とも,ラムダ式の部分は「xを2倍する」という意味である.
1行目の評価の結果は何だろう.ラムダ式を評価することで返される値は,手続き(procedure)である.返り値が手続きというのはあまり経験が無いだろう.詳しくは,別の回で演習する.
2行目の評価は,全体的に見れば「手続きの呼出し」の形をしている.下線部の評価結果は「手続き」であるので,その手続きに「3」が渡される.ゆえに,返される値は 6 である.
次の形式で,式には名前を付けること,すなわち,定義することができる:
(define 〈名前〉 〈式〉) |
式の定義は,Definitions 上で行う.
Definitions に下記を入力し,Run ボタンを押して定義しよう.
(define e 2.718281828459) ← 〈データ〉に名前を付ける (define pi (* (atan 1) 4)) ← 〈手続き呼出し〉に名前を付ける (define double (lambda (x) (* x 2))) ← 〈ラムダ式〉に名前を付ける |
続いて,Interactions でそれぞれの名前を評価してみよう.
> e > pi > (double 3) > (double (double pi)) |
果物の名前と価格を定義し,その名前を使って,果物の代金を計算しよう.
価格は次のように設定する.
apple | 110 |
---|---|
orange | 90 |
pineapple | 230 |
peach | 190 |
例として,apple 3つ,orange 5つ,pineapple 1つ,peach 5つの場合を計算しよう.
(define apple 110) (define orange 90) (define pineapple 230) (define peach 190) |
> (+ (* apple 3) (* orange 5) (* pineapple 1) (* peach 5)) |
上記の定数の定義をファイル「prac0601.scm」に保存してみよう.また,いったんdrscheme を終了し,再び起動して,定義ファイルを開いてみよう.
例題3の続きとする.贈り物用のフルーツセット(giftbox)には,メロンが1つ,林檎が5つ,オレンジが3つ入っている.メロンは単価が 800 円とする.giftbox の代金は,入っている果物の値段と箱代(box)50円の合計とする.giftbox の代金を定義しよう.
お得用フルーツセット(specialbox)には,1割引の桃が3つ,定価のパイナップルが1つ,2割引のオレンジが5つ入っている.specialbox の代金はそれらの果物の値段の和として箱代はサービスとする.specialbox の代金を定義しよう.
以上の定義を prac0602.scm に保存しよう.
次の式を計算するための関数を定義せよ.以下を prac0603.scm としてセーブしよう.