]> Panopticon :: ペンギンでもわかるScheme Archive

もっと式を入力してみましょう。
『3 + 5』 →( + 3 5 )

scheme1_51.jpg

『4 x 3』 → ( * 4 3 )

scheme1_52.jpg

『4 / 2』 → (/ 4 2)

scheme1_53.jpg

『2 / 4』の場合は(/ 2 4)となります。
足し算の手続き『+』の場合は、( + 2 4 )も( + 4 2 )と順番を変えても一緒ですが、
『/』手続きがとる引数はその順序が決められています。

『√9』 → ( sqrt 9)
『sqrt』はもとから定義されている、引数のルートを計算してくれる手続きです。

scheme1_54.jpg

『 | -3 | 』 → (abs -3)
『abs』は引数の絶対値を返します。

scheme1_55.jpg

ここまででわかるとおり、手続きにはひとつの共通点があります。
それは必ずカッコのなかで先頭にくるということです。
処理系はカッコのなかで先頭に来た要素を手続きとして判断します。
さきほどの入力、( abs 3 )の順序を逆にしてみましょう。

scheme1_56.jpg

『3』という手続きを、『abs』という引数に対して適用しようとしています。
これは、手続きとして『3』をもらったのに、『3』なんて手続き見つからないんですけど……というエラーです。
とりあえずここでは
『カッコの中で最初に来るのは手続き!そのあとに続くのは全部引数!』
と考えてください。
この手続きが先頭にきて、その後に引数を続ける記述方法を前置記法といいます。

今回は式を入力してみましょう。
『3 + 5』を計算するには
(+ 3 5)
と入力してエンターします。

scheme1_31.jpg

Schemeの式には基本的に二つのルールがあります。
1. 式は括弧でくくられる。
2. 式は前置記法で書く。

『3 + 5』とは、『3』と『5』を『足す』ことです。
このとき、『足す』を手続き、『3』と『5』を引数(ひきすう)といいます。
手続きを使うことを『適用する』といいます。
『3 + 5』とは、『3』と『5』に対して『足す』手続きを適用することです。
前置記法に関しては次回説明しますが、
ここではとりあえず手続きは引数より前に書かなきゃいけないんだと思ってください。
『3 + 5』の手続きは『+』です。
『+』を前に出して全体を括弧でくくると、
(+ 3 5)
となります。

『+』は2つ以上の引数をとることが出来るため、こんな書き方も出来ます。
これは『3+5+7』と一緒です。

scheme1_32.jpg

引数として変数も使えます。
(define a 2)
(+ a 3)
を評価すると5になります。
『a = 2』のとき、『a + 3』は5だから当たり前ですね。

scheme1_33.jpg

手続きにも名前をつけることが出来ます。
(define b +)
と入力しエンターすると、変数b の矢印は手続き『+』に向きます。

scheme1_34.jpg

手続き『b』は手続き『+』と同じように使えます。

scheme1_35.jpg

さっき定義した変数 aを使うと、

scheme1_36.jpg

手続きはそれ単体では評価することが出来ません。
『b』自体を評価すると、これ手続きですよ~と表示されます。

scheme1_37.jpg

わたしは英語で使ってますが、中身は一緒です。
ウィンドウが二段にわかれているのがわかります。
とりあえず下の段の 『>』 のところをクリックして、キャレット(文字入力カーソル)をもっていきます。

scheme1_21.jpg

まず 『3』 と入力して、エンターキーを押してみましょう。
『3』と二回表示されています。
緑色が入力した文字、青色がDrSchemeが返した文字です。
DrSchemeに 『3』 を渡すと、 『3』 を返してくれるのがわかります。

scheme1_22.jpg

次に『"a"』と入力して、エンターキーを押してみましょう。
『"a"』と二回表示されています。
さきほどと同様に、緑色が入力した文字、青色がDrSchemeが返した文字です。
DrSchemeに 『"a"』 を渡すと、 『"a"』 を返してくれるのがわかります。

scheme1_23.jpg

上で"a"は文字列を意味します。
DrSchemeはダブルクォーテーション"で囲まれたものを文字列として認識します。
では、ダブルクォーテーションを使わず、単に 『a』 と入力するとどうなるでしょう。

scheme1_24.jpg

天道虫と赤い文字が出てきました。エラーです。
『a』 って言われてもわかんないんです><
と言っています。

上の三種類の入力に対して、処理系のなかでいったい何が行われているのでしょう?

Schemeでは、 『3と入力してエンター』 する動作を、 『3』 を 『評価する』 といいます。
同様に、 『"a"と入力してエンター』 する動作を、 『"a"』 を『評価する』といいます。

上の例では 『3』 を評価した結果、青文字で 『3』 と表示されました。
これは、『3を評価した結果は3である』ということです。

また、 『"a"』 を評価すると青文字で 『"a"』 と表示されるのですから、
『"a"を評価した結果は"a"である』ということです。

『評価する』とはいったいどういうことなのか?
上の例では与えられた数字や文字列を鸚鵡返ししただけです。
数字や文字列を『評価する』と、その数字や文字列になります。

上の最後の例はエラーとなってしまいました。
これは『aを評価した結果がエラーである』、
つまり、aを評価しようと思ったけど出来なかったということです。

Schemeでは単に a と入力された場合、aは変数として扱われます。
ここでは 変数 a はなんか標識みたいなものだと思ってください。
標識には意味があります。
たとえば、『↑東京』という標識にそって進んでいけば、まず間違いなく東京に着きます。
同じように、a は矢印をもっています。その矢印の方向へずっと歩いていくと、『2』 という数字がありました。
これは、a は 『2』 を指し示す標識であるということ、つまり、変数 aの値が 『2』 であることを意味します。

エラーが起きた例では、変数 a という矢印はあるけれども、それは何にも指していない、
つまりa が意味のない標識だということです。
単に矢印だけの標識 『↑』 は、それがどこに通じているのかがわからなければ、
標識としては全く意味がありません。
標識に意味を持たせるためには、その矢印がどこを指しているのかしっかり定義してやる必要があります。

変数 aの矢印を数字の『2』に向けるには
(define a 2)
と入力してエンターします。

同じように、変数 bの矢印を文字列の『"a"』に向けるには
(define b "a")
と入力してエンターします。
define a 2
なんてやるとエラーになります。括弧でくくってあげてください。

scheme1_25.jpg

『a』 と 『b』 を評価してみましょう。
処理系は変数 a と b の矢印をたどり、『2』 、『"a"』という数字、文字列をそれぞれ見つけます。

scheme1_26.jpg

スタートメニューから起動。インストール時に設定したフォルダに入ってます。

scheme1_10.jpg

少し待ちます。

scheme1_11.jpg

こんな画面になりました。再インストール時には表示されませんでしたが、
初回起動時には初期設定があったかもしれません。以下の内容を読み替えてください。

DrSchemeは、方言も含めて何種類かの言語を扱うことが出来ます。
下のメッセージは、『その言語が指定されてないのでこのままだと動かないですよ~』という意味です。
まず日本語化し、それから言語を設定しましょう。

scheme1_12.jpg

メニューバーのヘルプボタンを押し、『DrSchemeを日本語で使う』

scheme1_13.jpg

何かウィンドウが出てくるので『承認』してください。
いったんDrSchemeが終了します。手動で再起動しましょう。
メッセージが日本語化されています。文字間隔がやたら詰まってて見にくいですが、
さっきのような画面になったら、『言語』ボタン( 『language』ボタン )をクリックし、『言語を選択』してください。

scheme1_14.jpg

PLTの脇の三角をクリックし、Graphicalを選択。
理由はわたしが最初に使ったのがこれだからです。

最上段の『Standard ( R5RS ) 』がSchemeの標準規格です。

scheme1_15.jpg

右上の『実行』ボタンを押してください。下のような画面になりましたか?

scheme1_16.jpg

Schemeで組んだプログラムを動かすためには処理系が必要です。
処理系ってのは人間とPCとの橋渡しをするソフトとでも思ってください。
人間が書いたプログラムをPCに理解できる形に直し、
PCが計算した結果を人間がわかるように表示する役割を持ちます。

ここでは教育機関で広く使われているDrSchemeを使ってみます。

DrSchemeへ移動し、ダウンロードをクリック。

scheme1_1.jpg

OSの種類を選んでダウンロードボタンを押す。

わたしはWindowsXPを使っているのでWindowsで!

256Mのメモリと60MBの容量が必要だと書いてあります。

scheme1_2.jpg

ダウンロード先を選ぶ。MIT(マサチューセッツ工科大学)にはMITSchemeという処理系もあります。こちらのほうが比較的高速なようです。

scheme1_3.gif

こんなファイルが出来ているはずなので実行

scheme1_4.jpg

インストール画面。

scheme1_5.jpg

インストール先を選んで

scheme1_6.jpg

スタートメニューに登録するフォルダ名を決めたらインストール。

scheme1_7.jpg

しばし待つ。

scheme1_8.jpg

続けてDrSchemeを起動しない場合はチェックをはずして下さい。

scheme1_9.jpg

Schemeというのはプログラミング言語の一種なんだけれども、はっきり言ってかなーりマイナーなので仕事でプログラム組んでる人にも知られてなかったりする……。そんなSchemeのすごさをひっそり広めてみる試み。

SchemeはもともとLispから派生したもので、関数型言語のひとつ。関数型言語の仲間のうちでは、LispとHaskellあたりが有名……っていってもたかが知れてるますね。構文が非常に単純なことと、徹底的に抽象化されていることが特徴です。こうした理由から大学の授業なんかでよく使われます。C→Javaとやってきて、オブジェクト指向とかデザインパターンがどーもわかんないんですよって人がたまにいますが、間に関数型言語が挟まればまずそんなことは起きません、たぶん。関数型言語を学ぶと、プログラムの構造に眼を向ける癖がつくからです。

(define (sqrt x)
  (define (improve guess)   
    ((lambda (a b) (/ (+ a b) 2)) guess (/ x guess)))
  (define (sqrt-iter guess guess-p)
    (define (good-enough?) 
      (< (abs (- guess guess-p)) (* guess 0.001)))
    (if (good-enough?)
        guess
        (sqrt-iter (improve guess)
                   guess)))
  (sqrt-iter (improve 1.0) 1.0))

Schemeのプログラムはたとえばこんな感じになります。はじめての人にはどう読んでいいのかすらわからないと思いますが、これはある数の平方根を求めるプログラムです(念のために言っておくと、Schemeには平方根を求める関数は最初から入ってます)。しかしこういう小さい例から初めてだんだん複雑な構造を考えていきましょう、というのがSchemerのバイブル『計算機プログラムの構造と解釈』の教えなので、とっくに誰かが作ってるものであってもどんどん再実装しながら勉強していくのがよいと思います。

上に述べたようにSchemeの実装はコンパクトですが、かなり強力なライブラリ群を持っているため、ちょっとなんか書いてみようかなというレベルならまず不自由なく書けます。そして何より書いてて楽しい!大量の括弧をみて難しそうだなと思う方がよくいるようですが、括弧の対応は機械がとってくれるので、プログラマがやるのは構造をしっかり考えることだけです。

僕の予想では、2008年くらいには関数型言語のブームきちゃうんじゃないのかな?という感じなので、ちょっと触ってみてもいいんじゃないでしょうか。