「サマーウォーズ」はこちら

Powered by Ayapon RSS! オススメ アフィリエイト テレビ オークション

2008年02月28日

Schemeに挑戦番外編 計算機プログラムの構造と解釈

Schemeに挑戦して、早2週間。
こちらのページを参考にしてやってきました。
http://www.shido.info/lisp/idx_scm.html

でも、高階位関数の部分で、もう何がなんだかわからなくなってしまいました。
ということで、本が欲しいと思ったので、ところどころで話題になる「計算機プログラムの構造と解釈」を購入しました。
たまたま近くの本屋で売っていたので、ちょっと高かった(4600円+税)ですが、即購入しました。中も開けずに。


家に帰って空けてみたら、思った以上に字がびっしりでビックリしました。
眺めてるだけで頭がよくなりそうです。

文章は、英文を直訳した感じで非常に難解です。
最近の小説とかに慣れてしまっていると、序文で挫折しかねません。


でも、例えや表現がとてもわかりやすい。
まだ10ページぐらいしか読んでませんが、木構造の図とかまさに入門用の表現だと思いました。

日本語が難解だし、図は少ないし、字はビッシリですが、思った以上にわかりやすくてビックリしました。


字がびっしりで、300ページちょいぐらいあるので、私のペースだとちょっとかかりそうですが、頑張って読みきろうと思います。


Wikipediaの解説
http://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E6%A9%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A7%A3%E9%87%88


英語版は、このページで全文読めるっぽいです。
http://mitpress.mit.edu/sicp/


日本語版の正誤表など
http://sicp.ipl.t.u-tokyo.ac.jp/

ひげぽんさんの、読み終えた感想
http://d.hatena.ne.jp/higepon/20061027/1161960363



posted by kafuca at 23:20 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2008年02月20日

Schemeに挑戦9 関数その3定義の省略

関数の定義を省略することができます。
例えば、

(define tashizan (lambda (x y) (+ x y)))

のように定義した関数があるとします。
これは、xとyの二つの入力を単純に足し算する関数ですが、これは次のように省略できます。

(define (tashizan x y) (+ x y))


この二つは、書き方が違いますが、同じ働きをする関数です。

(define (関数名 引数1 引数2…) (処理))

という形になります。
posted by kafuca at 23:23 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2008年02月19日

Schemeに挑戦8 関数その2引数

関数には引数がつきものです。
Schemeでも、引数はしてできます。

書き方は、

(define 関数名 (lambda (引数) (処理))

という形になります。

例えば、

(define tashizan (lambda (x y) (+ x y)))

と記述すると、関数のtashizanが定義されます。その説明が、lambdaの部分に書いてあります。
引数が、xとyの二つが定義されています。
後ろの部分で、xとyが足し算するように設定されているので、xとyが足し算をされて、出力されます。

MIT/GNU Schemeでは、上のプログラムを入力して実行した後に、

(tashizan 3 5)

と入力して、実行します。
tashizanという関数に、引数を指定しています。
3がxに、5がyに入って、実行されます。


引数には、任意の数を指定することもできます。
書き方は、lambdaの部分を、

(lambda (引数 . 任意の引数) (処理))

という形に記述することで可能になります。
「.」以降が任意の引数になります。

例えば、

(define number (lambda (a . b) (list a b)))

と入力すると、関数のnumberを呼び出す際に、引数をいくつも指定することができます。
2番目以降の引数は「.」の後ろにある、bに格納されます。
bに格納される時は、list形式で格納されます。

上の関数を定義した後に、

(number 1 2 3 4 5 6 7)

を実行すると、

(1 (2 3 4 5 6 7))

が帰ってきます。
必須の2つ目以降の任意の引数は、全てlistに格納されます。


文章がとてもわかりにくくて、申し訳ありません。
今後、理解が深まってきたら、書き直します。
posted by kafuca at 23:55 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

Schemeに挑戦7 関数その1定義

Schemeでは、関数を定義するのにもdefineを使います。

変数の定義と違うのは、関数はどのような挙動をするかも定義しなくてはいけないというところです。

その挙動を定義するのに、lambdaを使用します。

defineとlambdaを使用して、関数を定義します。

例えば、

(define helloworld (lambda () "Hello World!"))

を実行します。
そして、(helloworld)を実行すると、"Hello World!"と表示されます。


流れとしては、defineで「helloworld」という箱を定義します。
その箱の挙動が、lambdaの中に書かれていて、
空の()は引数を、""の部分が実際の挙動を示しています。
posted by kafuca at 00:27 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

Schemeに挑戦6 変数の定義

Schemeでは変数を宣言するのに、defineを使います。
書き方は、

(define 変数の名前 値)

という形です。ちょっとわかりにくくてすみません。

例えば、

(define name "suzuki")

と書くと、nameを呼び出した時に、suzukiと返ってきます。
nameという箱の中に、suzukiが入ってるようなイメージかもしれません。


上の例(define name "suzuki")を実行すると、結果は、"suzuki"
になります。
posted by kafuca at 00:11 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2008年02月15日

Schemeに挑戦5 リスト

Schemeには、リストがあります。

配列みたいなものでしょうか。


書き方は、

(list 要素1 要素2 要素3 ・・・)

となります。


要素の数はいくつでも大丈夫です。


例えば、

(list 1 2 3 4 5)

とすると、結果は、

(1 2 3 4 5)

となります。
posted by kafuca at 21:42 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

Schemeに挑戦4 コンスセル

Schemeは、Lisp系なので、リストの操作が上手なのだそうです。

リストの詳細は、こちらを。

3. リストを作ろう
http://www.shido.info/lisp/scheme3.html


リストの構成要素にコンスセルというものがあります。
コンスセルは、car部とcdr部の二つのアドレスを格納した、メモリ領域です。

コンスセルは、(cons 要素1 要素2)という形で指定します。

例えば、

(cons 1 2)

と、指定すると、car部に1、cdr部に2が入ります。


コンスセルは、数珠繋ぎに使うことが出来ます。
例えば、

(cons 1 (cons 2 (cons 3 4)))

というように指定できます。
こうすると、

最初のメモリ領域にcar部に1が入ります。
cdr部には次のメモリ領域のアドレスが入ります。

次のメモリ領域のcar部に2が入って、
cdr部に次のメモリ領域のアドレスが、

となって、数珠繋ぎに領域が繋がっていきます。


こうして数珠繋ぎになったコンスセルの一番最後のcdr部が「'()」になったものをリストと呼ぶそうです。

'()自体は、空のリストです。


「'」についてですが、これはquoteのことです。

例えば、
(+ 1 1)
と入力した時、結果は、計算されて「2」になります。

ですが、
'(+ 1 1)と入力すると、(+ 1 1)が計算されることなく、そのままの形で「(+ 1 1)」が出力されます。


つまり、'()は、空の()をさしているということです。


ちなみに、コンスセルを使ってないデータをatomといいます。
数字や文字は、atomにあたります。


もうすでにSchemeが難しいです。
このページは、

もうひとつの Scheme 入門
http://www.shido.info/lisp/idx_scm.html

を参考にして、理解できた分を書いてます。

間違ってる部分も多々あるかもしれません。ごめんなさい。
posted by kafuca at 21:37 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2008年02月14日

Schemeに挑戦3 簡単な文法と計算

今までPHPとかをちょっとだけ知ってた私ですが、Schemeの書き方はPHPと全然違うなぁと感じました。


Schemeでは、()がたくさん使われます。
その()が一つの塊になっていて、処理は()ごとに行われます。

(命令 引数1 引数2 引数3・・・・)

というような形です。

計算もその()を基準に行われます。



例えば、1+1の結果を表示するときは、

PHPだと、
a = 1 + 1;
echo a;

というような書き方です。

でも、Schemeだと、

(+ 1 1)

という式になります。


引数を増やすこともできます。

(+ 1 2 3 4 5 6)

とすると、中が全部足されて、

;Value: 21

と表示されます。


他の演算も同様です。

引き算
(- 3 2)

掛け算
(* 1 1)

割り算
(/ 3 3)

引き算や割り算は左から計算されていきます。


また、分数も使えます。

(11 / 7)

とすると、11/7と表示されます。


()ももちろん使えます。

(/ (+ 5 5) (+ 1 1))

とすると、まず、

5+5をして、10
1+1をして、2
10を2で割る

という流れになります。


算術演算もできます。

(sqrt 9)

とすると、平方根を求めたりも出来ます。
三角関数ももってこいです。
posted by kafuca at 23:59 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

Schemeに挑戦2 インストールと最初の実行

このサイトを参考に、処理系のインストールをしてみました。

もうひとつの Scheme 入門
http://www.shido.info/lisp/idx_scm.html


MIT-GNU Schemeをここからダウンロードしてきます。(英語)
http://www.gnu.org/software/mit-scheme/

選んだのは、Windows binaryです。Windowsなので。


インストールは特に問題も無く終わりました。


そして、インストールしたMIT-GNU Schemeを起動すると、ウィンドウが二つ出てきます。

「MIT-GNU Scheme」と、「Edwin: *scheme*」の二つの窓です。
この辺で、参考にしたサイトと微妙に違うのでちょっとあせりました。


入力できるのは、「Edwin: *scheme*」の方なので、こちらに命令を入力するんだ、というところまではわかりました。

そして、参考サイトの2ページ目を見ながら、命令を入力しましたが、実行の仕方がわからない。
クライアントは英語しか書かれて無いので、実行する前に挫折しかかりました。


Ctrlキー+Hキーでヘルプが出るので色々試してやっとわかりました。

命令を入力した後に、

Ctrlキー+Xキーを押す

その後に、Ctrlキー+Eキーを押す、

で実行できました。
やっぱり英語は大切だなと痛感しました。
posted by kafuca at 01:20 | Comment(1) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

Schemeに挑戦1 挑戦する理由

私は、趣味でPHPをいじる事があります。でも、基礎的な事しかわからず、PHPについて理解できてないなぁと感じました。

そこで、プログラムについて、ちゃんと勉強しようと思って、Schemeという言語に挑戦しようと思いました。


Schemeとは、関数型のプログラミング言語で、Lisp系のものらしいです。
アメリカの大学で、プログラミングの授業によく使われるらしいです。
http://ja.wikipedia.org/wiki/Scheme
詳細はwikipediaをどうぞ。


なぜ、Schemeに興味を持ったかというと、偉大なプログラマーである小飼さんが、コンピュータを学ぶにはSchemeがいいよ、とブログで言っていたからです。それだけです。

私の言語遅延学習法 - 三つのルール+1
http://blog.livedoor.jp/dankogai/archives/50999338.html


で、始めようと本屋に行きましたが、Scheme系の本が無かったので、参考になるサイトは無いかと検索しましたが、PHPなんかに比べて、日本語のページが非常に少ない。
私は、Windowsを使っていて、日本語しかわかりませんが、出てくるのは英語かLinux系ばっかりでした。


なので、このページを参考に進めていきたいと思います。
http://www.shido.info/lisp/idx_scm.html
posted by kafuca at 01:04 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。