Geek-Side

<< < 1 > >>

ようやく「継続」がわかってきた


Javaもろくにできない癖にLispにうつつをぬかしている今日この頃ですが、「プログラミングGauche」を読んでもピンとこなかった「継続」が、ようやくわかってきた気がします。
ようやく光が見えてきたのは「Schemeによる信号処理入門」と言う本のおかげなんですが、この本ではかなり単純化した形で継続を示してくれてます。

以下は本に載っていたの継続についての説明なんですが、継続を考えるには「自分自身を渡す手続き」を考えるとすっきりする気がします。

; この式の(+ 1 2)の継続を考える
(even? (* 3 (+ 1 2)))

; (+ 1 2)を a と考えると継続が得られる
(lambda (a) (even? (* 3 a)))

; この継続に(+ 1 2)を与えると元の式になる
((lambda (a) (even? (* 3 a))) (+ 1 2))
->(even? (* 3 (+ 1 2)))

; call/ccを使うと
(even? (* 3 (call/cc (lambda (x) (x (+ 1 2))))))

いままで見てきた継続の説明は、再帰を絡めて説明していたために、個人的にはわかりにくくなっちゃってたんですが、本書では実用的ではないけど単純な例で示してくれてます。
こう考えると、まだまだ再帰がものにできてないんだなぁと痛感します。

プログラミングGaucheの著者の方も、継続はすぐには理解できなくても大丈夫と書いてくれています。
でも、Schemeを構成するには継続はなくてはならないものである以上、理解した方がよいものと思ってます。
理解できないってやっぱり悔しいですしね。

SICP勉強会、行ってきました。


9/27(土)に大阪で開かれたSICP勉強会に予定通り行ってきました。

私の様に意志の弱い人間は、「場」が重要です。
一人で悩んでるとへこたれてしまうことも多々あるのですが、他の人も悩んでたりしているのを見ると、がんばれちゃうんですよね。
みんなが同じテーマについて考えている雰囲気のおかげで、密度の濃い時間を過ごす事ができました。

ついでにLingerも初体験だったのですが、Lingerで会場の内外の人と話せるのも良い仕掛けですね。

相変わらず口下手であまり話せなかったのが残念です。
決して近場ではないので、都合がつかなかったらLingerでのみ参加の可能性もあるけど、次回も是非参加したいです。

SICP勉強会にいってきます


前回は都合でいけなかったSICP読書会ですが、今回は参加できそうです。
SICP勉強会 #3

Scheme自体は大分慣れてきていることもあり、ついでに英語も勉強したいということで英語版で予習中。
The Little Schemerを読んだときと同様、iknowでリストを作りつつ勉強中です。

なかなか難航してますが、当日までには一通り予定範囲を読んどきたいもんです。

The Little Schemer 読了


Scheme本、The Little Schemer を読了しました。

この本はSchemeの再帰を問答形式で徹底的に教えてくれる良本です。
私の場合はプログラミングGaucheを先に読んだのですが、「The Little Schemer」を読んだ後に「プログラミングGauche」を読むと、さらにSchemeの理解が進みました。
私の感覚では、環境の整備とSchemeの基本的な部分は「プログラミングGauche」の第2部まででやって、「The Little Schemer」読了後に「プログラミングGauche」の残りの部分を読むとい読み方も良かったかもしれません。

この本の構成は問答形式になっています。
プログラミングの本を読むときは、よーく考えて実際にプログラムを書いて実行してみるってのが重要だと思うのですが、その点、この本の問答形式っていうのは凄く良い構成で、説明形式の本よりか読み流しにくい感覚があります。
章毎に練習問題を設けるプログラミング本はよく見かけますが、こういう問答形式のプログラミング本ももっと増えればいいのではと思います。

さて、この本の目的が再帰のマスターと序章で書かれているだけあって、再帰の説明が充実しています。
再帰の説明部分では、再帰を用いた手続きを実行したときに、値がどのようになっていくかを丁寧にトレースして処理の流れをつかむ様に仕向けられています。
再帰を展開してみて実際に書き出す作業をしているうちに、徐々に頭の中で展開できるようになっていけるようになりました。

また、継続渡しの説明が秀逸ですね。
この本では継続渡しを「集める」という単語で説明しているのですが、私の知るかぎりでは他の文章にはなかった説明です。
継続渡しを「集める」という感覚で理解すると、私の場合はすんなり理解できました。

この本はかなり簡単な英語で構成されています。
分からない単語は、iknowでリストを作ってみたのですが、総数は54個だけでした。
英語に抵抗のある人のハードルも低いと思います。

Schemeの重要な要素「再帰」を学んでSchemeの空気に慣れるには本当にいい本でした。お薦めです。




プログラミングGauche読了

今年のLanguage of the Yearは Gaucheなんです。
そんなわけで プログラミングGauche 読了

Scalaをやってみて、もうちょっと関数型言語に特化した言語を学ばないとと思ったのが去年の終わり。
ちょうど SICP を読むのがはやってた頃ってのもあって、Scheme処理系のGauche をチョイスした。
それ以降だらだらとスクリプトを組んだりしてたんだけど、プログラミングGauche が出たのをきっかけに腰を落ち着けてじっくり取り組む事にした。

という訳で恥をしのびつつ初晒し。
GoogleサイトマップにあるURLについて、はてなBookmarkのユーザ数を取得するスクリプト
 #!/usr/bin/env gosh

 (use rfc.uri)
 (use rfc.http)
 (use xsm.xml-rpc.client)
 (use sxml.ssax)

 (define *host* "b.hatena.ne.jp")
 (define *port* 80)
 (define *path* "/xmlrpc")

 ;; パラメータ 
 ;;    第一引数  ホスト名 
 ;;    第二引数  サイトマップへのパス
 (define (main args)
   (let ((server (make-xml-rpc-client (uri-compose :scheme "http" :host *host*
 						  :port *port* :path *path*))))
     (guard (e (else (print "error") (raise e)))
  	(map (lambda (x) 
  	       (let ((count (call server "bookmark.getTotalCount" x)))
  		 (if (< 0 count)
  		     (print x ":" count)))) (url-list (read-map (cadr args) (caddr args)))))))


 ;; Sitemapの読み込み
 (define (read-map site site-map) (receive (status head body) (http-get #?=site site-map)
 	   (call-with-input-string body (lambda (x) (ssax:xml->sxml x '((sitemap . "http://www.google.com/schemas/sitemap/0.84")))))))

 ;; SitemapからURLを取り出す
 (use sxml.sxpath)
 (define (url-list site-url) (map cadr ((sxpath '(sitemap:urlset sitemap:url sitemap:loc)) site-url)))

ちなみに大阪で SICP読書会 が行われているそうで。
第2回は都合でいけないけど、第3回以降は参加してみたいな。