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

LINQ

http://www.rubyist.net/~matz/20060128.htmlにて、LINQをRubyならどう書くというようなことを見て、Javaならどうかと考えた。 まず、直感的に思いついたのがこれ。 名 学籍番号前半名 = new Query<学生, 名>() { 名 select(学生 p) { return p.名;} boolean…

Java : メソッド名

メソッド名は動詞というネーミングコンベンションは誰が作ったのだろう? いつも引き合いに出す"サクサクSmalltalk―オブジェクト指向のアートとサイエンス"では、p.166 単に変数にアクセスするためだけのメソッドは、アクセスする変数名に対応して名前が付け…

Java : Mixin(多重継承)とかパーシャルクラスとか

JavaにはMixinやパーシャルクラスがないので、それっぽいことをしたいときには委譲コードをたくさん書かなければいけないから(´Д`)マンドクサ とか、言語上の欠陥だ!という勢いで批判する*1という人がいるけれど、それはJavaという言語を使いこなせていないだ…

デフォルトコンポジションとデフォルトメソッド

[id:lethevert:20051002:p6] [id:lethevert:20051003:p5] [id:lethevert:20051008:p1] 昔、この辺で、継承についてあれこれ考えていたのですが、 「インターフェース」と「クロージャ」さえあれば、「継承」は要らない とかって書いていました。 数ヶ月ぶり…

SICP : Ex1.44 : Java

[id:lethevert:20060126:p1] 関数を平準化するSmooth関数を作る問題。 Javaでカリー化を前提とした高階関数が書けるということを確認するという問題でもある。 [id:lethevert:20060127:p3]で作ったIterクラスを総称化したクラスに対して、Smoothクラスを適用…

SICP : Ex1.38 : Java

[id:lethevert:20060124:p6] オイラー展開で自然対数の底 e を求める問題。 abstract class ContFrac<A> { abstract A zero(); abstract A n(int k); abstract A d(int k); abstract A add(A a, A b); abstract A div(A a, A b); A solve(int n) { A ret = zero</a>…

SICP : Ex2.06 : Java

[id:lethevert:20060113:p1] チャーチ数を表現する問題。 クラスという余計な装飾がついたせいで、意味的には分かりにくくなってしまったかも。動作やできることはScheme版やConcurrent Clean版と同じ。 手続きを抽象化して、抽象化した手続きに対する手続き…

SICP : Ex1.35 : Java

[id:lethevert:20060108:p4] 不動点を求める問題 abstract class FixedPoint<R> { abstract R f(R x); abstract boolean closeEnough(R a, R b); R solve(R guess) { R next = f(guess); while (!closeEnough(next, guess)) { guess = next; next = f(guess); }</r>…

SICP : Ex1.04 : Java

[id:lethevert:20051219:p1] 手続きを条件で切り替えるという問題 public class Main { public static void main(String[] args) { System.out.println(plus_abs(2,3)); System.out.println(plus_abs(2,-3)); } public static int plus_abs(int x, int y) { …

だから関数型言語って何さ!!!

[id:lethevert:20060105:p3] では、「手続きの抽象化」ができるのが関数型言語だという結論を出したのですが、Javaでも十分に手続きの抽象化をすることはできたわけで、じゃあ何なんだ!という疑問が復活したのですが・・・ 関数型言語 ラムダ計算を先祖に仰…

Javaでは無理なこと

カリー化かなぁ。 コードを書いてやれば、カリー化を作ることはできるのですが、HaskellやCleanのように自動的なカリー化はないので、カリー化を前提とした高階関数は難しいかな。 いや、そうでもないかも。SICP Ex1.44で考察します。 (続く) - 追記)なん…

スコープの話

(let ((y 5)) (defun print_y (x) y) ; print_yを定義します (defun map2 (f lst) (let ((y 20)) (mapcar f lst))) ; print_yを評価します (let ((y 10)) (map2 #'print_y ; print_yを束縛します (list 1 2 3 4 5))))このコードの出力がどのようになるかを考…

Java : Smalltalk風の制御構文

abstract class Cntr { abstract boolean cond(); void ifTrue() {} void ifFalse() {} void once() { if (cond()) { ifTrue();} else { ifFalse();} } void repeat() { while (cond()) { ifTrue();} } void until() { while (!cond()) { ifFalse();} } } pu…

Delphi : クロージャ

前のDelphiでクロージャの件、クロージャ内で例外が起こった時にスタックがおかしくならないかと一瞬思ったが、ちゃんと巻き戻しているみたい。

Concurrent Clean : Concurrent?

このダイアリで、いつもConcurrent Cleanと書いていますが、実はConcurrentな側面がどうなっているのか追究したことはないのです。もちろん、意識して利用したこともないし、ちゃんとConcurrentかどうか確認したこともないです。わざわざConcurrentを付けて…

オートインデント

オートインデントって嫌い。好みに合わないときに、自分で整形しても、勝手に元に戻されたりすると、ぶち切れ。

Javaと関数型言語

最近、Javaのコードをダイアリによく書いているのですが、それは、Javaって今まで思っていたよりもずっと記述力が高いのではないかと、思うようになったからなんです。まだいろいろ試しているところなんですが、Java(特にJDK1.5)は、関数型言語と同程度の…

ISWIM : SECD machine : P.J. Landin

クロージャの一件で、Landinさんという名前を知ったのだけれど、この方について調べてみたら、面白いことに行き当たりました。 (下の論文には、クロージャ(閉包)という言葉をLandinが使ったという記述があります。 http://www.ice.nuie.nagoya-u.ac.jp/~h…

Concurrent Clean : 一意型と上手く付き合うには?

Cleanで実用的なプログラミングをするには、一意型を使わざるを得ないので、命令的なプログラミングになって、純粋関数型言語を使っているメリットが全然ないという不満があったのですが、SICPを読み進めるうちに、上手いやりようはあるのではないかと思うよ…

Java : 高階関数

Iter関数をJavaで書くと・・・ abstract class Iter { int m = 1; Iter(int n) { m = n; } int call(int i) { for (int c=0; c

SICP : Ex1.44 : Concurrent Clean

smooth f x = (f (x-dx) + f x + f (x+dx)) / 3.0 nth_fold_smooth n = iter n smoothこれは、このように展開される(n=3の場合) (smooth (smooth (smooth f))) x動きを見るために、以下のテストコードを実行 dx :== 0.1 //テスト用に大き目の値を設定 smoo…

Concurrent Clean : ABCマシン(8)

未定義命令 push_node updatepop_b buildh updatepop_a eq_desc buildI_b うーん・・・ - まず、build系の命令を補うことからはじめようかな。 CodeGeneratorのソースから解読するか。

最近の事件の件

この件に関して、ここに何か書こうとは思っていなかったのだけれど、あんまり気分が滅入るので、ちと毒を吐いておこうかと。 - 今は、東大までいっても、お金くらいにしか希望を見出せない人が少なからず生まれる程度には、希望に満ちた社会だということなん…

晴れ

昨日の教育の記事を修正

SICP : Ex2.4

Concurrent Cleanでは表現できないと思って飛ばしていた問題なのだけれど、ここ最近の記事の内容と関連すると思ったので、Schemeで書いておくことにします。 問題は、cons, car, cdrを特別なデータ型を仮定せずに、手続きだけで作り出すことができるというこ…

純粋型推論言語

OCamlにも「純粋」という冠をつけたいなあと思って、上の言葉を作ってみました。 最近は、補助的に型推論を持つ言語も登場してきたことだし、そういう言葉があってもいいかもしれない。 純粋型推論言語 ml, OCaml, Haskell, Concurrent Clean

教育

先日、会社で、新人教育で最低限やっておいて欲しいプログラミングの基礎知識について意見を聞かれて、まあ、そのときはそれなりに話したのだけれど、もうちょっと考えてみた。 計算量とデータ構造 メモリ管理 モジュール化(とインターフェースと型システム…

素数リスト

そういえば、Concurrent Cleanでは、素数リストは面白い考え方と書き方で生成できるんですよね。 http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap3.html#sc27

再帰

[id:mimpoo:20060124#p2] 再帰に苦しんでいる人を発見。 再帰は「場合わけ」だと思えばわかりやすいんですよね。あるいは「数学的帰納法」とか。 例えば、Hello!をn回出力するプログラム… 手続き hello n について n=0の時 → 終わり n=kの時 → Helloを出力…

SICP : Ex1.38 : Concurrent Clean

積み残しの問題がいくつかあるので、順番に片付けていきます。 Ex1.38 オイラー展開で自然対数の底 e を求める問題。 cont_frac n d j = cont_frac n d 0 where cont_frac n d k | k == j = 0.0 = (n k) / ((d k) + (cont_frac n d (k+1))) Start = 2.0 + co…