ひ日誌
2005-12-03 ( ja -> en )
_ [lambda][lisp][scheme] Yコンビネータのありがたみ?
Yコンビネータというのが、Scheme などで定義されてるコードを見ても、何やってるんだか理解の範疇を超えていてさっぱりわからない。The Little Schemer にも出てるけど、そこまでたどりつかないし。そんなに真剣に理解しようとしてたわけでもないのだけど、なんとなくひっかかりができてた。
ところが、「不動点演算子ふたたび」を見たら、最初に「右辺にfact自身が出現するので、再帰的定義なのであった。ここから右辺にfactが出現しないようにするのが目標」と何を目指すのか示されている。目指しているものが示されただけでも、これはなんとなくいけそう気がした。そのまま読み進めたら、なかなかわかりやすい説明で、どのようにYコンビネータが導かれていくのか、あっさりと理解できた。ちょっとうれしい。
もっとも、導き方はわかったとして、Yコンビネータがあると何がうれしいのか、というところはよくわかってなかったりする。再帰的な計算をする関数を変数に束縛せずに実行できる、というあたりがポイントらしいとは思うのだけど…
2005-12-06 ( ja -> en )
_ [lambda] Yコンビネータのありがたみ (2)
Yコンビネータのありがたみは何だろう、という疑問に答えもらったような気が…どうもありがとう。
ほんとうは、自分が直面しそうなプログラミング上の利点が何かあるのかな?みたいなところで考えていたのだけど、それはさておき…
数学厨の立場で本を読んだりしてると、しばしば、チューリング・チャーチの提唱というのが出てきて、チューリング機械とラムダ計算(とゲーデルが不完全性定理の証明に使った方法?なんて呼ぶのか?)は等価だ、というような記述に出くわします。いつも、そのまま「ふーん、そうなんだ」と感覚的に理解した気になって読んでるわけです。
Yコンビネータが「λ計算でも再帰が表現できる(のでチューリング完全である)ことを示す」のに使える、ということで、そこらへんの数学厨レベルがほんのちょっとだけ上がった気がしました。
はるか昔に、λ計算を習ったような気がしないでもないのだけど、そのときはまったく関心がなく、単位取る前に挫折。したような気がします。今考えると、その気さえあれば学ぶ機会はいろいろとあったのに、たいへん惜しいことをしたものです。
_ [javascript] Web2.0 的には役に立たない JavaScript プログラミング
せっかくなので、不動点演算子ふたたびと同じ展開で、意味もなく JavaScript で Yコンビネータを書いてみた。
まず普通に階乗を返す関数 fact を定義:
var fact = function(n) { return (n == 0) ? 1 : n * fact(n-1) };
(中略) make_fact 最終形:
var make_fact =
function(my_make_fact) {
var my_fact = function(n) {
return my_make_fact(my_make_fact)(n) };
return function(n) {
return (n == 0) ? 1 : n * my_fact(n-1) } };
make_fact を汎用化:
var make_f =
function(my_make_f) {
var my_f = function(x) { return my_make_f(my_make_f)(x) };
return F(my_f) };
var f = make_f(make_f);
make_f をインライン展開:
var f =
function(my_make_f) {
var my_f = function(x) { return my_make_f(my_make_f)(x) };
return F(my_f) }(function(my_make_f) {
var my_f = function(x) { return my_make_f(my_make_f)(x) };
return F(my_f) });
Fを引数とする関数 Y:
var Y =
function(F) {
return function(my_make_f) {
var my_f = function(x) { return my_make_f(my_make_f)(x) };
return F(my_f) }(function(my_make_f) {
var my_f = function(x) { return my_make_f(my_make_f)(x) };
return F(my_f) }) };
完成したので試してみる:
var Fact =
function(f) { return function(n) { return (n==0) ? 1 : n * f(n-1) } };
Y(Fact)(10) => 3628800
Y と Fact もインライン展開して実行してみた:
(function(F) {
return function(my_make_f) {
var my_f = function(x) { return my_make_f(my_make_f)(x) };
return F(my_f) }(function(my_make_f) {
var my_f = function(x) { return my_make_f(my_make_f)(x) };
return F(my_f) }) }(function(f) {
return function(n) { return (n==0) ? 1 : n * f(n-1) } }))(10) => 3628800
ここまで、JavaScript は Scheme にそっくりという点では、ほとんどそのまんま書き下せた。Yコンビネータに関しては、Scheme のブログラムの方がだいぶ読みやすい気がするけど、いきなり見ても何してるのかさっぱりわからない…という点では似たようなものか。
もし、こういうのを Web 2.0 文脈で実用的に使う方法を示すことができたら、「λ計算 2.0」などと呼んでみるのもいいかもしれないが、僕の頭ではとうてい思い付きそうにないな。
_ [memo][javascript] GoogleMaps ゼビウス
Google Maps APIでシューティング作ろうとして挫折
こういうのを実際に作ってみるという心意気が素晴らしい。「挫折」と書いてるけど、それでも「作っている最中に分かったこと」を「参考にどうぞ」という姿勢も素晴らしい。JavaScriptのソースコードのリンクもあり。
2005-12-08 ( ja -> en )
_ 流行語の価値は、大賞を取ったとたんに暴落することが多いけど…
きのう、なんとなく「λ計算 2.0」と書いてみて、ちょっと「〜残念〜斬り!」を使ってるみたいな気分になった。きょう、「次のキラーアプリは「カレンダー」--「When 2.0」カンファレンス開催」というニュースタイトルを目にして、「なんでだろ〜♪」をノリノリで歌ってる人を見たような気分にちょっとなった。みんな半分くらいはそんな気分を持ちつつ「2.0」使ってるんだよね?こういうのまだ言っちゃまずいのかな?本来マイベースキャラなのに、ちょっと流行に影響され過ぎな気がしてきたきょうこのごろ。
BuzzWord フォー!
2005-12-10 ( ja -> en )
_ del.icio.us が Yahoo に join して Flickr の兄弟になった!
ちょっと前に、del.icio.us は何を目指してるのだろう?などと書いたりしたのだけど、その del.icio.usが、Yahooに買われたらしい。やはりというか、ひたすらこの線を目指してサービス作っていたということ?他にどんな可能性があったのか、アイディアとその開発はともかく、ビジネス的発想の苦手な僕には思いつかない。誰か解説してしてくれないかな?
y.ah.oo!には、とりあえず記念コメントしておいた。
(追記) さっそく、y.ah.oo! を解説してくれてる(というか結果解説になってる)方々が…
こういう面を熱く?語れるということがちょっとうらやましい。どちらかと言えば hatenaoyaさんに共感。実際にわかりやすい価値を生み出している(と思う、今のところはてなをほとんど使ってないので正直詳しく知らないのだけど)人の意見としても。をじさんの言うことなんか気にしないでいい。さて、自分はと言えば、いろいろと足場を固めようと思ったら、こういうことも考えなきゃいかんのかなぁ、というだめだめなスタンス。
(追々記) 「del.icio.us買収と1470.netのExit戦略」は、いくつかの名フレーズ(「スーツ脳」など)ありの涼しく熱いテキスト。malaさんの言う「美意識」と僕が下に書いた「『創りたい衝動』の匂い」はつながっているのだと思う。
_ 「創りたい衝動」の匂い
del.icio.us に関するつぶやき で、アーティストに例えていたところから連想したのだけど、僕の想像するところ、del.icio.us を実際に考えて開発してる人(たち)にしてみれば、投資家などの周囲や本人たちのいろんな思惑に影響されつつも、純粋な創りたい衝動にかられて作った面はかなり大きいと思う。そういうモチベーションで作られたものに特有の匂いというものがあるような気がする。うまく説明できないけど…
2005-12-11 ( ja -> en )
_ [javascript] Haskell風にJavaScript
malaさんがHaskell風にJavaScriptを書くというのを作ってる。
fact = FunctionMaker(n);
fact(0).eq(1);
fact(n).eq(function(n) { return n * fact(n-1) });
というようにかっこよく宣言的に fact を定義できる。malaさんのところの例だと:
fact(n).eq("fact(n-1) * n");
というように、再帰の部分を文字列で渡してる。つまり eq に文字列を渡すと適当な関数に変換されるみたい。文字列を文字列として扱いたい場合もあるから、文字列も含めてすべてそのまま扱えるといいなという気がしました。
2005-12-17 ( ja -> en )
_ 身に付けた言語
「C,C++,Java,Perl,Lispは身に付けた。次は英語だ!」という英会話学校のRSSキャッチコビーを見た。RSSだけに、さすがにターゲットを絞ってる。というかLisp。来年は Ruby と JavaScript の年だというのに先を行き過ぎ・絞り過ぎである。
そこで「C,C++,Java,Perl,Rubyは身に付けた。次は英語だ!」としてみる。ん?
こちらのパターンだと「おれもそろそろRuby やらねば」と考える人は多そうである。すると、英語なんかやってる場合じゃない。Rubyをやらねば、ということになりかねない。
一方、前者(オリジナルのLisp版)の場合は、「Lisp?何それ」とか「Lispねぇ、オレには関係ないね」という展開で、そのまま英語へという流れができそうな感じがする。
実際のところ、現在、「おれもそろそろ Ruby やらねば」と考えてる人は「そろそろLispを」よりもはるかに多そうである。なるほど。これは Lisp にした方が効果が高そうだ。そこまで読んでの Lisp 選択?さすがプロのコピーは違う。
このコピーの応用として、「C,C++,Java,Ruby,Scheme,英語は身に付けた。次はHaskellだ!」というコピーで「ふつうのHaskellプログラミング」へつなげるというパターンなども考えられる。「英語かぁ、おれにはもう無理」という展開で、そのまま日本語で書かれたHaskell本へ、という流れ。あるのか?わからん。が、僕はそんな感じかも…というわけで楽しみにしてます。
もひとつ別の応用として、「C,C++,Java,Ruby,Schemeは身に付けた。次は計算機科学だ!」というコピーで SICP こと「計算機プログラムの構造と解釈」へとつなげるパターン(強引だ)。まさに今、ここで使ってみているのがこれ。自己言及…再帰的…
2005-12-19 ( ja -> en )
_ del.icio.us 依存症
y.ah.oo!後、やたらと調子の悪い del.icio.us だが、使い始めて1,2ヶ月程度の乗り遅れ野郎だというのに、すでにかなり依存してしまっていることを実感。
_ [memo] 21世紀の労働倫理
「ワンダと巨像」がどんなゲームなのかはさっぱり知らないのだけど、「異質の感性への思いやり」や「高度な技術と高度な感性の融合する協調性」などのフレーズが出てくるあたりが好きなテキスト。アメリカ産の映画やマック用のアプリケーションなども、このような労働倫理で制作されているんじゃなかろうか、という気がする場合が多い。 del.icio.usにメモれないのでここにメモ。
2005-12-20 ( ja -> en )
_ [javascript] あとで行く
ぼんやりしてたら、オブLOVE夜会第2弾「イマドキのJavaScript」に乗り遅れてしまったのだけど、懇親会に行く予定です。よろしくどうぞ。JavaScript経験は、この日誌にお試しコード片をちょろちょろと書いたくらいです。以前、MineSweeper を書いてみたんだけど、見た目や仕掛けを作る前に飽きてしまいました(ダメじゃん)(未完成ジャンク品junk:mine)。
2005-12-22 ( ja -> en )
_ [scheme] Schemeリングに参加
はてなリングがどういうものなのかよくわかってないのだけど、はてなリング - schemeに参加しました。
_ [javascript] オブLOVE夜会第2弾「イマドキのJavaScript」に参加
結局、最初のgorouさんの放談から参加してきました。うすうすわかってはいたのだけど、すごい人がいっぱいいるなぁ、若者すごいなぁ、ということを実感。GizaフレームワークでSafariが落ちる(=デバッグのチャンス?)。ppencodeすごい。異常に敵弾の多いゲームも面白かった。Vim は「ヴィム」と読むことを知った。人前で「ギーク」と発声するチャンス?だったのに逃した。でかいプレゼンの本を持っていけばよかった。Lisp 2009年説を気に入ってくれている方々。などなど…なんか JavaScript とあまり関連のない雑感になってしまいました。みなさん、おつかれさまです。かくたにさん、幹事のお役目ご苦労様でした!
(追記) Lispの話しはしたのに、JavaScript と Lisp を結びつける展開の話しをしそびれた。「JavaScript is acceptable Scheme!?」とか…
(追記2) Vimを使っている人が多いらしいみたいな中、「もっぱら Emacs!」と言ったらなぜか関心されたような気がする
2005-12-23 ( ja -> en )
_ [scheme] プログラミング言語における「あとで書くメソッド」
じわじわと浸透しつつある「あとで書くメソッド」(発祥元はogijunさんの日記)。『「あとで読む」 と 「あとで書く」』などを読んでいると、もうネタだ本気だかよくわからなくなってきた。そんな「あとで書くメソッド」だが、Lisp系のアルゴリズム言語 Scheme (R5RS) では Syntax になっていることをご存知だろうか?
(delay (display "オブLOVE夜会楽しかった"))
これを日本語に書き下すと:
(display "オブLOVE夜会楽しかった") について「あとで評価する」
ということを意味し <promiss> を返す。<promiss>は「あとで評価する」ための契約というか約束手形のようなものであり、関数 force を使って評価させることができる。
(force <promiss>) => "オブLOVE夜会楽しかった"
により実行、メッセージが表示される。プログラマは式の評価のタイミングをブログラミングすることができる。いわば「あとで書く」という約束を都合の良いときに果たしてもらうことができる、と言えよう。この機能は、遅延ストリームの実装などにも使用される。このあたりについては、SICPこと「計算機プログラムの構造と解釈」の第3章で念入りに解説されているので、僕もあとで読むつもりだ。
さらに、台湾の天才ハッカーが短期間で Perl6 を実装するのに用いたと噂に聞く、Haskell という関数型プログラミング言語にいたっては、「あとで評価する」のが標準仕様らしい。これについても、あおきさんの本であとで勉強するつもりである。
ここまで書いてみてわかったような気がする。「あとで書くメソッド」は時代の必然なのかもしれない。
さてひとつ気になることがある。「あとで書くメソッド」の場合だが、どうしたことか Scheme における force に相当するメソッドがない。なので、「あとで書く」内容にものすごく期待し読みたいと思ったところで、読み手にはどうすることもできない。これはとても問題である。この問題の解決方法について、最近、私は多少わかってきたような気がするのだが、それについては、もちろん:
あとで書く。
2005-12-25 ( ja -> en )
_ [life] ポール・グラハムさんが「あとで書く」について語っている!
ような気がする。
冒頭を超訳してみた(「先延ばしする」を「あとで書く」だと思ってください)
私が一目置いている人たちはみな、かなりの先延ばし屋さん(優柔不断)だ。ってことは、先延ばしってのは、必ずしもいけないことではないのじゃなかろうか?
先延ばしのことを書くとき、ほとんどの人は、どうやって先延ばし癖を治すか、というようなことを書いている。だが、これをきちんと説明するのは不可能だ。できることは無限にある。何を(無限の中から選んで)やるにせよ、その他のことはやらないということになる。問題は、どうやって先延ばしを避けるかではなくて、いかにうまく先延ばしするか、ということだ。*1
先延ばしには、やるべきことの代わりに何をするかによって、(a) 何もしない (b) より重要でないことをする (c) もっと重要なことをする、と3つのバリエーションがある。このうち (c)「もっと重要なことをする」のが良い先延ばしだ、ということを論じる。
なんというか、なまけものの僕がうれしくなってしまうような論が展開されそうな予感…ポール・グラハムさん、クリスマスプレゼントをありがとう。
…だが、僕の英語力ではここらが限界。眠いし…そのうちどなたかが解説付きで翻訳してくれるに違いないので、残りはあとで読んで、あとで書く。
_ [life] ハッカー人生の裏に潜んでいるかもしれない闇
なんだか気になるテキストを読んだ。あとで思い出しやすいよう、my del.icio.usだけでなく、こちらにも貼っとこう。
広い視野で、本物のプログラマ(広義にハッカー的性質の人ととらえました)の生き方について語っている、いろいろと考えさせられるテキスト。ポール・グラハムのテキストには、ちょっと能天気な面というか楽天的だなぁと思うところもあって、そこが癒し系テキストになっているのだと思うけど、こちらの文章はそういった楽天的な面の裏側に潜んでいるかもしれない暗黒面に真摯に目を向けている…そんな気がした。
こう言うとちょっとおおげさかもしれないけど、読むときにはちょっとした覚悟が必要かもしれない。ポール・グラハムを合わせて読んで中和するとか…
_ [life][neta] 勤めてみたい職場を妄想
毎日が江戸デイな職場。下っ端で働くと気楽で良さそうだ。
仕事をさぼって rogue をやってたら、姐(あね)さんに見つかる。「あんた、なにさぼってんの」。「すみません、姐さん、こんなのもありやすよっ」と適当に落ちゲーを教えてやった。「これ、おもしろいねぇ」すっかりはまってる様子だ。そこに親方登場。「なんでぇなんでぇ、またさぼってやがるなぁ」「ん?どれどれ?」親方にはモナディウスを教えてみた。「えぃ、ちくしょめぃ!おもしれぇじゃねぇか」親方撃ちまくり。そして、自分は趣味プログラング…結局、みんな仕事なんかそっちのけ。日が傾いたころ「いやぁ、きょうも仕事したねぇ」「それじゃまた」「おう!暗くなると辻斬りが出るから、気をつけて帰りねぇ」
とこんな感じ。素晴らしい。
…などと書いているとまずいかもしれない。何しろ、blog で就職が決まるかもしれない時代なのだ。
*1 この段落の最初の超訳はあきらかに意味が違っていたので修正しました。passerbyさんどうもありがとう。誤訳を読んだ方々ごめんなさい (2005-12-26 10:50 JST)
2005-12-31 ( ja -> en )
_ [読書] SICP を読もう
結局、最後まで読めなかった「計算機プログラムの構造と解釈」(SICP)。来年も続けて読もう。一度最後まで流し読みしてそれからじっくりと。浮き足立たずにマイペースでぼちぼちと。
この本は、計算機科学の入門書という位置づけのようですが、どこを切り取っても、いろんな方面に向かって奥行きを感じさせるような、そんな意図を持って書かれているように思われます。今の自分の力ではそんなところをさらっと読み通せない、そんな本だからこそ、僕にとってスルメのような味わいのある本となってきました。
…などと「あとで必ず読む」状態のままですが思うわけです。




Before...
_ mala [いちおう関数を渡すのデフォルトのつもりで、短く書けるように文字列や数値でも渡せるようにしてあります。 "'strin..]
_ hisa [文字列の場合 eval するということですね]
_ hisa [あとから気づいたんだけど、fact や fib は、普通にif文使って再帰的に書くのと見た目はあまり変わらないですね..]