Diary-nagataka-シリコンバレーで働きたい!という夢への日々

外資ITで働くエンジニアが趣味や日々の事など書いてます(技術の話は別ブログ http://wanna-be-geek.seesaa.net/ )

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告
  3. このエントリーを含むはてなブックマーク

忘備録

.emacsに以下を追加

(setq scheme-program-name "gosh")

(require 'cmuscheme)

(defun scheme-other-window ()

"Run scheme on other window"

(interactive)

(switch-to-buffer-other-window

(get-buffer-create "*scheme*"))

(run-scheme scheme-program-name))

(define-key global-map

"\C-cS" 'scheme-other-window)


こうすると、二分割したwindowの片っぽでプログラムを書きながら、もう一方で処理系(ワタシはGaucheを使用)を動かしてファイルを読み込んで実行が出来る!

便利やぁ!!

一番感激したのが...Emacsがプログラム中のカッコの対応を点滅して教えてくれる事!
いや~最初っからこの情報を仕入れていればどんなに楽だったでしょうw(まぁずっとこういうサポート機能無しで書いてたから最近は慣れてきて、インデントをちゃんと整えて書くようにして、それを頼りにいくつ末尾にカッコが必要かパッとわかるようになってきてたけど)

使い方

C-c S 別ウィンドウで gauche インタプリタが起動する。
C-c C-l Scheme file のロード
C-x C-e 直前のS式を評価
M-C Space カーソルの次のS式をマーク
M-C-a カーソルを含むトップレベルのS式の先頭へ移動
M-C-e カーソルを含むトップレベルのS式の末尾へ移動
M-C-f 次のS式へ移動
M-C-b 前のS式へ移動


情報はコチラのサイト様で調べさせてもらいました、謝謝^^


あとは、SICPを読んでいてなんとなく印象に残ったトコを一つメモ

We are not at that moment concerned with how the procedure computes its result, only with the fact that it computes the square.


Thus, considering only the values they return, the following two procedures for squaring a number should be indistinguishable. Each takes a numerical argument and produces the square of that number as the value.25

(define (square x) (* x x))

(define (square x)
(exp (double (log x))))

(define (double x) (+ x x))


So a procedure definition should be able to suppress detail. The users of the procedure may not have written the procedure themselves, but may have obtained it from another programmer as a black box. A user should not need to know how the procedure is implemented in order to use it.


今までプログラムを書く上で何気なくそうしてたけど、改めてこうやって文章で書かれているのを読むと、「そうなんだよな~」って思ってしまう。

で、Lispって、上のレベルから関数を定義して行けるから凄い!

例えば、以下はこの教科書に出ているニュートン法実装の例

(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))


A guess is improved by averaging it with the quotient of the radicand and the old guess:

(define (improve guess x)
(average guess (/ x guess)))


where

(define (average x y)
(/ (+ x y) 2))


We also have to say what we mean by ``good enough.'' The following will do for illustration, but it is not really a very good test. (See exercise 1.7.) The idea is to improve the answer until it is close enough so that its square differs from the radicand by less than a predetermined tolerance (here 0.001):22

(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))


Finally, we need a way to get started. For instance, we can always guess that the square root of any number is 1:23

(define (sqrt x)
(sqrt-iter 1.0 x))


最初にsqrt-iterを定義する時点では、まだgood-enough?もguessもimproveも何も定義されていないってのが凄い!!
CとかJavaでこれやったらまずここでバシバシ怒られるw

関数定義プロセスを考えてみると、
まずCやらJavaなんかでは
1:何をする関数なのか?(ここではニュートン法によって二乗根を求める)
2:その関数にはどんな値が必要なのか考える
3:その値はどのように得られるのか、得るために必要な関数なり式なりを考える
ここでまた、再帰的に3に対して1を適用して、葉までたどり着いたら下から順番に実装していく。

一方のLispは
1の段階からすぐに実装ができてしまう!
そして、上のプロセスでは一旦一番下まで降りてから実装開始だったけど、降りながら実装ができちゃうってのが凄い!


うろ覚えだけど、誰かが書いた
「Lispは、Lispを使って考えられるトコロが素晴らしいんだ」
というような内容の文章を思い出した。

CやJavaでは、頭の中で考え、時には紙に書き出したりして設計して、概要が脳内に出来上がってからプログラムに落とし込む

一方のLispは、「Lispを使って考える

ただの実装用のプロセスとしてのプログラミングではなくて、考えるtoolとしてのプログラミング言語
というような事をどこかで読んだ気がする。

なんだか、まだまだ俺のレベルじゃぁそんな境地には到達し得ないだろうけど、その一端を見た気がしたこのLispという言語の仕様とprocedural abstractionなのでした。
スポンサーサイト
  1. 2008/02/29(金) 15:15:27|
  2. SICP
  3. | トラックバック:0
  4. | コメント:0
  5. このエントリーを含むはてなブックマーク
<<今日は | ホーム | How much?>>

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nagataka.blog50.fc2.com/tb.php/175-c65774ad
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。