HOME もうひとつの Scheme 入門 書き込む

2. Scheme を電卓代わりに使う


1. 初めに

ここでは、scheme を電卓代わりに使ってみましょう。Windows に付録で付いている電卓より便利に 使うことができます。

2. 電卓としての使用法

まず、スタート → 全てのプログラム → アクセサリ → コマンドプロンプト で DOS プロンプトを立ち上げます。
DOS プロンプトで mzscheme と入力すると、図1に示すようなプロンプトが表示されます。 上矢印 (↑) で以前の入力を呼び出すことができます。

図 1: DOS プロンプトから立ち上げた MzScheme

また、Emacs 経由で MzScheme を立ち上げることもできます。 runemacs.exe またはそのショートカットをダブルクリックして Emacs を立ち上げます。 前章のように .emacs が編集されていると、 そのまま MzScheme が立ち上がります (図 2)。
Ctrl-↑ で以前の入力を呼び出すことができます。
Scheme 処理系が走っていると、 終了するとき、"Active processes exist: Kill them and exit anyway?" と聞いてきますので、 "yes" を選択して終了します。


図 2: emacs から立ち上げた MzScheme

ここで、 1+2 を計算してみましょう。プロンプトに次のように入力してください。

> (+ 1 2)
3
> 
3 という答えが返ってきました。
ここで注目して欲しいのは以下の3点です。
  1. 括弧は計算の1ステップを表す。この場合は 1+2 という 1 ステップを表しています。
  2. 関数名を最初に書き、続けて引数を書く。Scheme ではほとんど全てが関数で、 この例では関数名 '+' に続けて2つの引数 1, 2 を書いています。
  3. 要素(トークン)の区切りはスペースを使う。
計算過程を少し詳しく分析してみます。Scheme の関数では、カッコ内のトークンが全て評価されてから、 計算が行われます。仕様により、評価の順番は不定です。つまり、必ずしも左から右へ行われるわけではありません。 '+' は任意個の引数をとることができます。
(+) → 0
(+ 1)  → 1
(+ 1 2) → 3
(+ 1 2 3) → 6

3. 四則演算

Scheme (多くの Lisp) では分数を扱うことができます。浮動小数点に変換したいときは exact->inexact を使います。 また、複素数も扱うことができ、a+bi と書きます。ここで、 a は実数部で、b は虚数部です。 +, -, *, / はそれぞれ足し算、引き算、掛け算、割り算を表します。 足し算と同様に任意個数の引数を取ることができます。

(- 10 3) → 7
(- 10 3 5)  → 2
(* 2 3) → 6
(* 2 3 4) → 24
(/ 29 3) → 29/3
(/ 29 3 7) → 29/21
(/ 9 6) → 3/2
(exact->inexact (/ 29 3 7)) → 1.380952380952381
括弧は入れ子にすることができます。

(* (+ 2 3) (- 5 3)) → 10
(/ (+ 9 1) (+ 2 3)) → 2

練習問題 1

次の値を Scheme の処理系を用いて計算してください。
  1. (1+39) * (53-45)
  2. (1020 / 39) + (45 * 2)
  3. 39, 48, 72, 23, 91 の合計
  4. 39, 48, 72, 23, 91 の平均を小数で。

4. その他の算術関数

4.1. quotient, remainder, modulo, sqrt

商を求めるにはquotient, 余りを求めるには remainder または modulo, 平方根を求めるには sqrt を使います。
(quotient 7 3) → 2
(modulo 7 3) → 1
(sqrt 8) → 2.8284271247461903

4.2. 三角関数

sin, cos, tan, asin, acos, atan が使えます。atan は引数が1つの場合と2つの場合の2つがあります。値が 1/2 π になる可能性がある場合は (つまり tan の値が無限大になる可能性がある場合は) 引数が2つのほうを使います。
(atan 1) → 0.7853981633974483
(atan 1 0) → 1.5707963267948966

4.3. 指数関数、対数関数

指数関数は exp, 自然対数は log で求めます。 ab 乗は (expt a b) で求めます。

練習問題 2

次の値を Scheme の処理系を用いて求めてください。
  1. 円周率 π
  2. exp(2/3)
  3. 3 の 4 乗
  4. 1000 の自然対数

5. 終わりに

今回は Scheme の処理系に慣れるために、Scheme を電卓として使ってみました。 次回は リストの操作について説明したいと思います。

練習問題の解答

練習問題 1

;1
(* (+ 1 39) (- 53 45))              ⇒    320

;2
(+ (/ 1020 39) (* 45 2))            ⇒    1510/13

;3
(+ 39 48 72 23 91)                  ⇒    273

;4
(exact->inexact (/ (+ 39 48 72 23 91) 5))   ⇒    54.6

練習問題 2

;1
(acos -1.0)               ⇒   3.141592653589793
(* 4.0 (atan 1.0))        ⇒   3.141592653589793  ;; 数値計算プログラムで、円周率を求める一般的な方法。
                                                  ;; 厳密に言えば、精度、計算速度はこちらのほうが優れている(はず)。

;2
(exp 2/3)                 ⇒   1.9477340410546757

;3
(expt 3 4)                ⇒   81

;4
(log 1000)                ⇒   6.907755278982137