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+2 という 1 ステップを表しています。
- 関数名を最初に書き、続けて引数を書く。Scheme ではほとんど全てが関数で、
この例では関数名 '+' に続けて2つの引数 1, 2 を書いています。
- 要素(トークン)の区切りはスペースを使う。
計算過程を少し詳しく分析してみます。Scheme の関数では、カッコ内のトークンが全て評価されてから、
計算が行われます。仕様により、評価の順番は不定です。つまり、必ずしも左から右へ行われるわけではありません。
- '+' と言う記号が評価されて、足し算という手続きになります。
試しに、プロンプトから '+' とだけ打ち込むと、
#<procedure:+>
と表示されます。これは '+' が、procedure (手続き)を表すシンポルであることを表しています。
- '1' が評価されて 1 になります。 一般にリテラル(真偽値、数、文字、文字列)は評価されると自分自身になります。
シンボルは評価されると別のものになります。
- '2' が評価されて 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+39) * (53-45)
- (1020 / 39) + (45 * 2)
- 39, 48, 72, 23, 91 の合計
- 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 で求めます。
a の b 乗は (expt a b) で求めます。
練習問題 2
次の値を Scheme の処理系を用いて求めてください。
- 円周率 π
- exp(2/3)
- 3 の 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