プロジェクト改善提案

今日は2つの提案をしました。


特にビルドテストの仕組みはshadowさんの

「自分のところ以外が原因でMakeができないというのが一番やる気がなくなるのでね(w」

という開発者目線での発言がきっかけで良い指摘だと思いました。


そういえば闘うプログラマのなかでもマイクロソフトのビルドの仕組みが書いてあったけどこういうのは重要だなあ。

関数型言語の勉強にSICPを読もう - (1) SICPを読み始めた理由

計算機プログラムの構造と解釈-Structure and Interpretation of Computer Programs(以下SICP)」という本を読み始めました。
なぜ読み始めたかを書いておくと後から読み返して初心を思い出すことができると思うので書いておきます。


世の中ではにわかに関数型言語(特にHaskell)がブームです。
もちろんそのブームにのっかったってのもありますが、d:id:higepon:20051214:1134573806にもあるようにそれ以前にSchemeを勉強しようとして挫折したことがあります。


僕がSICPを読もう・関数型言語を学習しようと思ったの理由は以下の通り。

  • ときどき「関数型言語はすごいらしい」と聞こえてくる。でも何がすごいのか理解できない自分がいた。
  • 自分が尊敬するプログラマの多くがSICPを読んでいたり関数型言語を理解している。そして勉強することをすすめられる。
  • 自分は大学などで情報系の学部ではなかったので、基礎が出来てないのではないかと常に不安だった。基礎がおろそかになっているせいで、いつか壁にぶつかるのではないか不安だった。
  • 初心者から見た関数型言語のイメージである再帰処理をスラスラと書けないことに気づいていた。
  • 勉強してマスターしたときに今までの自分とまったく違う考え方になるかもしれないと期待している。

これらの理由が重なって今の決心があります。(続く)


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404

関数型言語の勉強にSICPを読もう - (2) SICPを読む上で自分に課したルール

SICPを本気で読もうということで以下のルールを自分に課しました。
自分が人生で使える時間は限られているので厳しめになっています。

  • 挫折禁止
    • 挫折するのが一番駄目。人に聞いても良い。毎日1ページずつでも良いとにかく進む。
  • 出来るだけ練習問題を解く
    • 受験生ではないけど手と頭を動かさないと覚えなさそう。
  • 練習問題が難しい場合は答えを見ても良い
    • 一人では無理な場合もある。答えを見て理解できたならばそれで良し。
  • 勉強の過程を文章に残す
    • 自分用の記録として、そして後学者のために。
  • 数学の難しさに起因するものはスキップしても良い
    • 理解したい部分は数学の部分ではないので。
  • 流し読みしない
    • 分かった気になったけど何も頭に残らないのは駄目。


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404

関数型言語の勉強にSICPを読もう - (3) 1章 - 手続きによる抽象の構築(1-30ページ)

1章の途中までは演習問題をノートに書いていたので記録が残っていないです。ごめんなさい。

9ページ

(+ 5 1)と(* 5 2)に置き換えて簡約された。
→簡約ってなんだろうか?

原文

This gives the same answer as our previous evaluation model, but the process is different. In particular, the evaluations of (+ 5 1) and (* 5 2) are each performed twice here, corresponding to the reduction of the expression

(* x x)

with x replaced respectively by (+ 5 1) and (* 5 2).

置き換えによって、(* x x)という表記が減ったと言いたいらしい。
→後日Haskellのドキュメントを読んでいても「簡約」という言葉が似たような文脈で出てきていたのでそういう用語みたいです。

16ページ

bindの対義語はfreeとの事。
対義語を提示してくれると概念が理解しやすいということですね。
勉強になりました。

17ページ

最後の3行が分からない。
原文

A procedure is a pattern for the local evolution of a computational process. It specifies how each stage of the process is built upon the previous stage. We would like to be able to make statements about the overall, or global, behavior of a process whose local evolution has been specified by a procedure. This is very difficult to do in general, but we can at least try to describe some typical patterns of process evolution.

22ページ

両替の話。本当に動くのかなと思ったが動いた。
結構感動した。

(define  (count-charge amount)
  (cc amount 5))

(define (cc amount kind-of-coins)
  (cond ((= amount 0) 1)
        ((or (< amount 0) (= kind-of-coins 0)) 0)
        (else (+ (cc amount (- kind-of-coins 1))
                 (cc (- amount (first-denomination kind-of-coins))
                     kind-of-coins)
                 ))))

(define (first-denomination kind-of-coins)
  (cond ((= kind-of-coins 1) 1)
        ((= kind-of-coins 2) 5)
        ((= kind-of-coins 3) 10)
        ((= kind-of-coins 4) 25)
        ((= kind-of-coins 5) 50)))

ちょっと改造して

(define (first-denomination kind-of-coins)
  (cond ((= kind-of-coins 1) 1)
        ((= kind-of-coins 2) 5)
        ((= kind-of-coins 3) 10)
        ((= kind-of-coins 4) 50)))

とすれば日本の100円の両替に使えそう。

問題 1.11

再帰的なのはすぐ解ける。

(define (f n)
  (cond ((< n 3) n)
        (else (+ (f (- n 1))
                 (* 2 (f (- n 2)))
                 (* 3 (f (- n 3)))))))

反復が分からない。
答えを見ても

(define (f-iter n)
  (define (iter a b c count)
    (cond ((= count 0) c)
          ((= count 1) b)
          (else (iter (+ a (* 2 b) (* 3 c)) a b (- count 1)))))
  (iter 2 1 0 n))

うーん。うーん。
久々だなぁ。分からなくて途方にくれる。。
自分の頭が良くないことが痛感させられる。
スラスラと理解できるようになりたい。

問題1.12

(define (pascal x y)
  (cond ((or (= x 1) (= x y)) 1)
        (else (+
               (pascal (- x 1) (- y 1))
               (pascal x (- y 1))))))

関数を書き終わった後に動く気がしないという不思議な感覚にとらわれる。
手続き型の言語だったら、関数が動くイメージが映像として浮かぶんだけど、この関数では浮かばない。
式を定義したら勝手に動いている、自分がこの関数を生み出したんだという感覚が全然ない。
不思議!

問題1.14

手で木構造を描いた。
ステップ数は^n。スペースはn。

問題1.15

12.15を3で割っていくので 5回。
プロセス・スペースはa

問題1.16

逐次平方という用語がいまいち分からなかった。
でも答えや例を見れば、プロセスの増加数を抑えられることも分かるしそのためにとっている方法も理解できる。

パス

1.17
1.18
1.19
数学っぽいのでパス。
ここが本質ではないことを祈る。

1.20
作用的順序のほうがプロセス数が少ないんだな。
1.28まで演習パス


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404

関数型言語の勉強にSICPを読もう - (4) 1章 - 小休止 Schemeの環境整備

(4)の原稿が消失した(涙)ので書き直しました。
SICPでは、サンプルプログラム・演習問題はすべてSchemeで書かれています。

SICPで学べる概念自体はSchemeという言語から切り離すことが出来るとは思うのですが、それでもやはりScheme環境の整備が必要です。


僕はEmacsSchemeを書いているのでその環境を紹介します。

Scheme

Schemeインタプリタをインストールします。
この本を読みはじめたときは guileを使っていましたが途中で Gaucheに乗り換えました。

GaucheのインストールはDebian系であれば

apt-get install gauche

で完了です。
それ以外の環境の方はGaucheドキュメントを参照されると良いでしょう。

Emacs

EmacsにはSchemeソースコードの編集モードと、編集→実行をサポートしてくれる仕組みがあります。


.emacs

(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)
(defun run-guile () (interactive) (run-scheme "guile"))
(defun run-gauche () (interactive) (run-scheme "gosh"))


ソースコード(例:hoge.scm)を編集中に M-x scheme-mode とするとScheme編集モードになります。
その状態で M-x run-gauche とするとEmacsないにSchemeインタプリタが開きます。
そこに手でコードを書いていっても良いのですが、C-x 2 などでウィンドウを分割して、上を hoge.scmの編集、下を インタプリタにし、上の編集画面で式の直後で C-x C-e とするとその式が下のインタプリタで評価されるのでその機能を利用しましょう。(下の画像をクリックすると拡大します。)


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404