2006-01-01から1ヶ月間の記事一覧

晴れ

昨日の記事にメモ化版を追加

Java : Y Combinator

Javaで高階関数がかけたところで、今度は例のmemoizeとfixの問題「[id:lethevert:20050904:p3]」を解いてみましょう。 追記)FixとFibMakerの関係を逆にしました。 追記2)もっとシンプルにしてみました。 追記3)メモ化版も追加 abstract class Fix { abs…

Java : 高階関数

最近使っているJavaで高階関数を実現する手法ですが、関数型の形式から変換するのに、ちょっと慣れが必要ですが(まあ、すぐに慣れますが)、この変換をすると、そこで何が起こっているのかが、ちょっと分かりやすくなるような気がします。本質的に何も変わ…

純粋オブジェクト指向言語

JavaにJDK1.5からautoboxingが導入されたということで、これで晴れてJavaが「純粋オブジェクト指向言語」になれましたね。 http://www.techscore.com/tech/J2SE/JavaLanguage/3.html ということで、私の辞書の中で純粋オブジェクト指向言語は2つになりまし…

結論:結局、Javaはクロージャを使えるの?

【追記 2008/7/2】とても昔のClosureについて書いた記事が注目を集めてしまったみたいですが、ぜひ、もっと後で書いた次の記事とその関連スレッドの方も確認してみてください。このときよりも、もう少し事情が分かってから書いたものなので、より正確に状況…

Java : 高階関数

当初の目的とはだいぶ違う方向に進んでいってしまいましたが、そのおかげでだいぶJavaという言語に対する知見を深めることができたような気がします。 ということで、そろそろJavaで高階関数を書くテーマに挑戦できそうです。 - まず、ここで考える高階関数…

純粋関数型言語が非正格である理由

HaskellやConcurrent Cleanは、純粋関数型言語です。つまり、副作用を持たず、関数を第一級として扱える言語です。(関数プログラミングとか関数型言語とかって何? → [id:lethevert:20060105:p3]) しかも、非正格(normal order)な評価をするという特徴が…

Java : まるでプロトタイプベースのような

interfaceとファクトリークラスと無名クラスを組み合わせるパターンです。 JavaScriptの特にJSONでおなじみのオブジェクトの記述(http://jsgt.org/ajax/ref/test/json/test1.htm)を思い出させるものがあります。 - 例は、IDのついたオブジェクト(Managabl…

Pascal(delphi)の関数内関数はクロージャなの?

そもそも、クロージャという言葉が、Lispという関数が第一級である言語から生まれたので、Pascalの関数内関数のように第一級でない関数に対して適用するのは無理がありまくりだとは思うのですが・・・ Lispでは、関数が第一級であることは、そもそも始めから…

Smalltalk-72

[id:sumim:20060121]さんのところで、Smalltalk-72のエミュレータの解説をされてました。 「's」がメッセージになっているところに軽い衝撃を受けてみたり。

TAPL : Types and Programming Languages (The MIT Press)

id:sumiiさんのレジュメで紹介されていた本。 AmazonのBook Descriptionを読んだ感じ、面白そうだったので、次に読む本にしようと思います。 ああ、KnuthのThe Art of Computer Programmingも欲しいのに。

そういえば私は・・・

FPのライセンスホルダーです。*1 *1:Financial Plannerの方ですが・・・

晴れ

Ruby方面から訪れる方が激増中ですよ。 どちらかというとRubyの記事は少ないような気がするのですが。 Rubyが流行っているぞ、ということなんですかね。

関数型とオブジェクト指向

[id:lethevert:20060118:p2] Smalltalk-72のクラス定義を見ていて思ったのです。 クロージャを「状態を持った手続き」ということができるなら、オブジェクトは、それを「手続きを持った状態」と読み替えたものと言えるのではないか? [id:lethevert:20060117…

Concurrent Clean : 総称関数

Cleanの言語仕様の中に、「総称関数」の項目があることに気づいた(いや、前から知っていたのだけれど) http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap7.html が、これは、つまり、CLOS型のオブジェクト指向プログラミングがで…

Java : interface

Javaにはヘッダファイルが存在しないので、宣言と実装が分離しにくくて、ソースコートが読みづらい、という印象を持っている人っていないだろうか? 少なくとも、最初の頃、私はそういう印象をJavaに対して持っていた。 interfaceという機能を知ったのは、随…

Java : ローカルクラスがfinalなローカル変数しかアクセスできない理由

Javaがローカルクラスの仕様を決めたとき、ローカル変数をわざわざfinalな変数に絞ったのには、なにか合理的な理由があるはずだと思うので、それを推測するコーナー。(あくまでも「推測」なので、証拠を出せとか言われても困ります。) - まず、ローカル変…

クロージャ

自分流の定義をする前に、本来の定義を確認するのが先じゃないでしょうか、ということで。 まず、クロージャという言葉がLispやその他の関数型言語の世界で、静的スコープやファーストクラスの関数オブジェクトで静的スコープを実現するための技術を指す言葉…

Smalltalk

[id:lethevert:20060117:p1] なんか、ここのコメント欄がすごいですよ。 - ところで、クロージャの起源については、[id:lethevert:20050813:p2]のShiroさんのコメントが参考になりますよ。 - 紹介されているSmalltalk-72のクラス定義の仕方、まるでLispです…

クロージャ

クロージャの説明をしたキーワードを作成してみました。 >関数型のみなさま なれないLispのコードとか書いているので、間違いとか見つけたら、修正してあげてくださいませ。 - なんか、リンクされないなと思ったら、モデレートされてました。 - ところで、…

Java : ローカルクラスを使いこなせ!

ついこの間まで、ローカルクラスの存在を知らなかった私([id:lethevert:20060115:p3]のコメント欄参照)が言うのもなんですが、関数的な方もメッセージ指向の方も、あまりJavaを甘く見ないほうがいいかもしれないです。 Javaは、非常に純粋なオブジェクト指…

Concurrent Clean : カウンタ

JavaScriptのクロージャを使ったカウンタを真似して、 function makeCounter () { var count = 0; return f; function f () { return count++; } }Concurrent Cleanでも作ってみたけれど、よくみたら、ただの遅延ストリームだった。 ::Counter a = Counter a…

SIMULA

Smalltalkのブロックがどこから来たのかな?と思って、SIMULAの文法を調べてみたのですが、いいウェブページを発見。 http://staff.um.edu.mt/jskl1/talk.html while文やfor文もあるし、Smalltalk的なブロックは持ってないみたいです。 あれはLispのlambdaに…

クロージャ

なんか、気分を害させてしまったようで、申し訳ない。そういうつもりではなかったのだけれど。 言い訳させてもらうと、「クロージャは、可読性を下げるので、小さくするべきだ」という命題が、どう考えても論理的に意味のある命題になっていないように感じた…

楽天証券

サーバー弱すぎ・・・ ダメすぎ・・・

Java : クロージャ

Delphiでクロージャ([id:lethevert:20060110])をやったので、次はJavaでもクロージャをやりたいと思うのですが・・・ - 実際は、Javaには、もうほとんどクロージャと読んでもよいものがあるんですよね。つまり、無名クラス。(そういえば、昔も似たような…

静的型付け vs. 動的型付け(変数の型無し)

[id:lethevert:20051224:p1]に型について、思っていることを書いたのですが、その続きというか、なんと言うか。 - LispやSmalltalkといった変数の型がない言語があるのですが、僕は、これらの言語を使って、大規模なプログラミングを型エラーなしに作り上げ…

はてなアンテナが

関数的なアンテナhttp://www.jmuk.org/samidare/functional.htmlの更新を捕まえてくれなくなった。

Concurrent Clean : ABCマシン(7)

[id:lethevert:20051229:p3] とりあえず、Appendix CをCleanに翻訳することは完了した。 次は、不足している関数を補って、テストコードを走らせて見よう。

Delphi : 末尾再帰

まず、普通の再帰 function Sum(N, Accum: Integer): Integer; begin if N = 0 then Result := Accum else Result := Sum(N-1, Accum+N); end;さて、末尾再帰の最適化については、 http://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_tail.htm…