トップ 最新 追記

Onion開発日記

2004|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|

ToDo:


2007-05-01

_ [今日の運動]ウォーキング,5.3km

_ [今日の食費]0円,残り13006円

今日は、朝・昼・夕全部自炊。

_ [Java]Genericの謎:解決

2005-10-01の日記で、java.lang.Object#getClass()の返り値の型がClass<? extends Object>と宣言されているにも関わらず、java.lang.Objectのサブクラスの静的な型に応じて返り値の型が変わるのかわからないというような事を書いたが、今日、ふと思い立ってJLS 3rdを眺めていたら、JLSの4.3.2「The Class Object」に次のような記述があった(強調した部分が返り値の型に関する記述)。java.lang.Object#getClass()の返り値の型はコンパイラによって特別に、Class<? extends T>(TはgetClass()の呼び出し対象の式の静的な型)とみなすように扱われているということだ。

The method getClass returns the Class object that represents the class of the object. A Class object exists for each reference type. It can be used, for example, to discover the fully qualified name of a class, its members, its immediate superclass, and any interfaces that it implements. A class method that is declared synchronized (§8.4.3.6) synchronizes on the lock associated with the Class object of the class. The method Object.getClass() must be treated specially by a Java compiler. The type of a method invocation e.getClass(), where the expression e has the static type T, is Class<? extends |T|>.

しっかし、利便性のためとは言え、一つのメソッド定義だけをコンパイラが特別扱いするのはびみょーな気がする。こういう問題は、SelfTypeがあればもうちょっとまともに解決できたのかも。もしも、Javaの構文を拡張するなら、こんな感じか?

public native java.lang.Object<? extends like this> getClass();
本日のツッコミ(全1件) [ツッコミを入れる]

_ 斎藤ただし [> 全部自炊 まじ素晴らしいっす。 ]

本日のリンク元 | 14 | 12 | 11 | 8 | 8 | 6 | 6 | 5 | 5 | 5 | TrackBack(0)

2007-05-02

_ [今日の運動]ウォーキング,約5km

今日はいつものループ道路ではなく、東通りを北上するルートにしてみた。のはいいんだが、帰り道でいきなり激しい雨に降られ、びしょ濡れになってしまった。災難。

_ [今日の食費]241円,残り12765円

本日のリンク元 | 59 | 45 | 32 | 17 | 16 | 16 | 12 | 9 | 9 | 8 | TrackBack(0)

2007-05-03

_ [今日の食費]1600円,残り11165円

今日は外食メインだったので、高め。

本日のリンク元 | 22 | 13 | 9 | 8 | 7 | 6 | 6 | 6 | 5 | 5 | TrackBack(0)

2007-05-04

_ [今日の食費]0円,残り11165円

本日のリンク元 | 78 | 36 | 25 | 23 | 13 | 13 | 10 | 10 | 9 | 9 | TrackBack(0)

2007-05-05

_ [今日の食費]0円,残り11165円

ここ数日、1日のエントリが今日の食費だけになってるなあ。

本日のツッコミ(全2件) [ツッコミを入れる]

_ yach [食事の内容も書くといいかも・・・ ]

_ みずしま [確かに。ただ、食事内容をいちいち毎日書くのはめんどい ので続けられるかという不安が。 ]

本日のリンク元 | 34 | 10 | 9 | 8 | 7 | 6 | 6 | 6 | 6 | 5 | TrackBack(0)

2007-05-06

_ [今日の運動]ウォーキング,3.8km

今日は斎藤君に加えて、yoosakiさんとご一緒させていただいた。yoosakiさんとは俺の以前のバイト先の会社に、自分が入る前に勤めていた人という非常にビミョーなつながりはあったものの、お会いするのは今日が初めて。RubyとかJavaとかバイト先について色々話しながらひたすら歩いた。

最近というか前から痛感していることなんだけど、自分の会話のレパートリーってかなり狭いなあ。もうちょっと色んな話題についていけるようにならないと。

_ [研究]進捗

Parser GeneratorのJava Parser用定義ファイルができた。あとはどういう風にベンチマークを取るかだな。

_ [今日の食費]300円,残り10865円

朝、夕は自炊。昼飯は抜きにした。

本日のリンク元 | 31 | 18 | 14 | 14 | 10 | 9 | 9 | 8 | 8 | 8 | TrackBack(0)

2007-05-07

_ [Java]GenericなVisitor(改良版)

2006/10/28のエントリで、GenericなVisitorと題して、VisitorをGeneric化する手法を紹介したんだが、研究のプログラムに使ってみて、あれは少なくともIDEの補完機能を活用するという点においてはかなり使いにくいことがわかってきた。というわけで、改良版というか、本来ならこうしとくべきだったという方法を紹介しておく。まず、以前紹介した手法では、Visitorはvisitメソッドの引数の型だけをパラメータ化して、戻り値の型はメソッドでパラメータ化していたが、そうではなく、戻り値の型もVisitorでパラメータ化する。具体的には、こんな感じ。

interface Visitor<R, C> {
  R visit(AddExp e, C c);
  R visit(SubExp e, C c);
  R visit(MulExp e, C c);
  R visit(DivExp e, C c);
  R visit(IntExp e, C c);
  R visit(VarExp e, C c);
  R visit(SetExp e, C c);
  R visit(BlkExp e, C C);
}

他の部分は、以前とほとんど同じだが、Visitorの型パラメータが増えているので、それに関する部分だけ変更する必要がある。

以前の手法と比べた場合の欠点として、visitメソッドごとに異なる型の返り値を持つことができないということがあるが、考えてみるとそういうケースはあんまり無かったし、大した欠点にはならない気がする。

import java.util.*;

public class Main { public static void main(String[] args){ Exp exp = new BlkExp( new SetExp("x", new IntExp(2)), new SetExp("y", new IntExp(3)), new SetExp("z", new IntExp(4)), new MulExp(new AddExp(new VarExp("x"), new VarExp("y")), new VarExp("z")) ); Integer result = exp.accept(new Calculator(), new Env()); System.out.printf("{ x = 2; y = 3; z = 4; (x + y) * z } = %d%n", result); } }
class Calculator implements Visitor<Integer, Env> { public Integer visit(AddExp e, Env env){ return e.left.accept(this, env) + e.right.accept(this, env); } public Integer visit(SubExp e, Env env){ return e.left.accept(this, env) - e.right.accept(this, env); } public Integer visit(MulExp e, Env env){ return e.left.accept(this, env) * e.right.accept(this, env); } public Integer visit(DivExp e, Env env){ return e.left.accept(this, env) / e.right.accept(this, env); } public Integer visit(IntExp e, Env env){ return e.value; } public Integer visit(VarExp e, Env env){ Integer value = env.lookup(e.name); if(value == null) throw new RuntimeException("undefined variable '" + e.name + "'"); return value; } public Integer visit(SetExp e, Env env){ Integer value = e.exp.accept(this, env); env.set(e.name, value); return value; } public Integer visit(BlkExp e, Env env){ Integer value = 0; for(Exp element : e.exps) value = element.accept(this, env); return value; } }
class Env { private Map<String, Integer> table = new HashMap<String, Integer>(); Integer lookup(String name){ return table.get(name); } void set(String name, Integer value) { table.put(name, value); } }
abstract class Exp { abstract <R, C> R accept(Visitor<R, C> v, C c); }
abstract class BinExp extends Exp { final Exp left, right; BinExp(Exp left, Exp right) { this.left = left; this.right = right; } }
class AddExp extends BinExp { AddExp(Exp left, Exp right){ super(left, right); } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }
class SubExp extends BinExp { SubExp(Exp left, Exp right){ super(left, right); } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }
class MulExp extends BinExp { MulExp(Exp left, Exp right){ super(left, right); } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }
class DivExp extends BinExp { DivExp(Exp left, Exp right){ super(left, right); } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }
class IntExp extends Exp { final int value; IntExp(int value){ this.value = value; } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }
class VarExp extends Exp { final String name; VarExp(String name){ this.name = name; } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }
class SetExp extends Exp { final String name; final Exp exp; SetExp(String name, Exp exp){ this.name = name; this.exp = exp; } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }
class BlkExp extends Exp { final List<? extends Exp> exps; BlkExp(Exp... exps){ this.exps = Arrays.asList(exps); } <R, C> R accept(Visitor<R, C> v, C c){ return v.visit(this, c); } }

_ [今日の食費]295円,残り10570円

本日のリンク元 | 16 | 13 | 11 | 10 | 10 | 9 | 7 | 7 | 7 | 6 | TrackBack(0)

2007-05-08

_ [Ruby]MS、「Silverlight」を複数プラットフォーム対応へ

Matzにっき経由。MS版Ruby処理系「IronRuby」が発表されたそうな。すげえ。

_ [今日の食費]735円,残り9835円

本日のリンク元 | 39 | 24 | 23 | 18 | 12 | 12 | 11 | 10 | 9 | 9 | TrackBack(0)

2007-05-09

_ [今日の食費]1390円,残り8445円

残りの食費もだいぶ少なくなってきた。外食を控えて、もっと自炊するようにしよう。

_ [Scheme][その他]GaucheNight

行って来た。soutaroさんと16:00につくばセンターで待ち合わせていたのだが、実はGaucheNightは19:30開始。今行くと早過ぎるけど、大学戻っても仕方無いということでとりあえず秋葉原まで。会場で飯が食べられるかどうかわからなかったので吉野屋で軽く飯を食べてから会場へ。

会場に到着したのは18:30頃で、まだ開始1時間前なのにもうそれなりに人が並んでいて、ちょっとびびってしまった。再入場不可ということで、ちょっと躊躇したが、どうせ他に時間をつぶす所も無いしということでさっさと入場してしまうことに。PEGの論文読んだりErlangのSoftTypingの論文がアレだという話をsoutaroさんから聞いたりして時間をつぶした。

で、19:30になっていよいよ開始。第1部?は、Scheme/Common Lispについて、出演者(黒田さん、川合史朗さん、子飼弾さん、小野さん、山下さん、まつもとさん(Skype出演))が座談会のような形で語るというもの。出演者のキャラクター性が出ていて楽しめたけど、話が途中からグダグダになっていた感が。ツッコミ所も色々あったし。こういうとき、プロシン方式だと色々嬉しいんだけど、それを期待するのは酷だろうか。あと、通信環境の問題か、まつもとさんとSkypeがうまくつながらず、結局ほとんどまつもとさん抜きで話が進んでいたのが残念。

で、座談会が終わった後に若干の休憩をはさんで第2部。こっちの方は、LL Nightみたいな感じ、自分の作ったソフトウェアについて5分間で語るというもの。一番印象に残ったのは、最初の方であった、Gauce rfb(うろ覚え)。こういう風な技術の無駄使い(褒め言葉)は実に素晴らしいと思う。つか、ここで魔法言語リリカルLispのスクリーンショットを見ることになるとは思わんかった。あと、植山さんのPEGパーザコンビネータの話は個人的にもうちょっと聞きたかった。

GaucheNight終了後、予想よりも若干早く終わったので、植山さんに挨拶。以前LingrのGaucheルームでちょっと議論をしたことがあって、一度実際に会ってみたいと思っていたのだった。終バス(終電)まであまり時間も無いので、ちょっとだけ話をして、さっさと会場を離脱。なんとか11:00の筑波大学行きのバスに間に合った。

本日のツッコミ(全4件) [ツッコミを入れる]

_ 植山 [ruiです。お世話になります。ほとんどお話できず申し訳なかったです。私は松戸でつくばはそんなに遠くないですし、お話で..]

_ みずしま [みずしまです。あまりお話できなかったのは私も残念でしたが、 お気になさらず。技術系の勉強会やらイベントがあるのは大体..]

_ kanbayashi [id:hargもgauche nightに行っていたらしいっす http://d.hatena.ne.jp/harg..]

_ みずしま [そうみたいだねえ。知ってたら挨拶くらいしてたかも。 ]

本日のリンク元 | 65 | 52 | 15 | 15 | 13 | 11 | 8 | 8 | 8 | 7 | TrackBacks(3)

2007-05-10

_ [今日の運動]ウォーキング,3.8km

今日はかなり暑かった。もうちょっと歩く前に水を飲んで行った方が良いかも。

_ [その他]豪雨

夕方、食材の買出しに行って、これから帰ろうという時になっていきなり猛烈な雨が降ってきた。買出しに行く間くらいは、まだ天気は保つだろうと楽観的に構えていたが、甘かったか。おかげでこれ以上は濡れられないくらいびしょ濡れになってしまった。

_ [その他]TBスパム

TBがちゃんと受け付けられるようになったと思ったら、今度はTBスパムが増えてきた。TBスパムフィルタもなんか導入しようかな。

本日のリンク元 | 37 | 30 | 26 | 25 | 24 | 22 | 19 | 18 | 12 | 11 | TrackBack(0)

2007-05-11

_ [今日の食費]2574円,残り5871円

本日のリンク元 | 8 | 6 | 5 | 4 | 3 | 2 | 2 | 2 | 1 | 1 | TrackBack(0)

2007-05-12

_ [その他]風邪?

今朝からどうも鼻水が止まらないし、体がだるい。暑かったので冷房つけっぱなしで寝たせいかなあ。

_ [Onion]FizzBuzz

何故かあちこちで流行っているFizzBuzz問題。せっかくなので、Onionでも書いてみた。Javaで書くのとほとんど変わらんけど、iの型を宣言してないとか、for文に括弧がいらないとか、ビミョーに違う。

for i = 1; i <= 100; i++ {
  cond {
    i % 5 == 0 && i % 3 == 0 { System::out.println("FizzBuzz"); }
    i % 3 == 0 { System::out.println("Fizz"); }
    i % 5 == 0 { System::out.println("Buzz"); }
    else { System::out.println(i); }
  }
}

_ [今日の食費]0円,残り5871円

本日のリンク元 | 69 | 50 | 22 | 15 | 13 | 13 | 12 | 11 | 9 | 9 | TrackBack(0)

2007-05-13

_ [今日の食費]0円,残り5871円

本日のリンク元 | 2 | 1 | 1 | 1 | 1 | 1 | TrackBack(0)

2007-05-14

_ [今日の運動]ウォーキング,3.8km

いつも通り7:00に待ち合わせのはずが、寝坊して20分くらい遅れてしまった。情けない。

_ [今日の食費]0円,残り5871円

本日のツッコミ(全2件) [ツッコミを入れる]

_ 斎藤ただし [どんまい。 今日の失敗は、明日の成功を妨げる理由にはならないのです。ぼちぼちいきましょう。 ]

_ みずしま [うい。ありがとう。また生活習慣がたるんできたから気をつけ ねば。 ]

本日のリンク元 | 10 | 9 | 9 | 8 | 7 | 7 | 6 | 5 | 5 | 5 | TrackBack(0)

2007-05-15

_ [今日の食費]850円,残り5021円

_ [Java]JDKオープンソース化

数ヶ月前にJava SEがオープンソース化されるという発表があったが、先日、仮想マシンやjavacなどだけでなく、JDK自体がGPLでリリースされたらしい。

本日のリンク元 | 37 | 18 | 15 | 9 | 9 | 8 | 6 | 5 | 5 | 5 | TrackBack(0)

2007-05-16

_ [今日の運動]ウォーキング,3.8km

今日は暑すぎず寒すぎずちょうどいい天気で、気持ちよく散歩できた。

_ [トレーニング]腹筋

ヒビルテ経由。

昨日、soutaroさんから最近の界隈で腹筋が流行っているらしいということを聞いて、ここに書いてある腹筋を試してみた。

無理。これを1日10回5セットは今の俺ではありえない。1日5回2セットくらいならなんとかできそうなので、とりあえずそれくらいから始めてみよう。

_ [今日の食費]424円,残り4597円

本日のリンク元 | 94 | 59 | 29 | 29 | 26 | 25 | 23 | 17 | 16 | 13 | TrackBack(0)

2007-05-17

_ [今日の運動]ウオーキング,1.7km

小雨がぱらつく中を傘をさして歩いたが、これはこれで涼しくて気持ち良かった。

_ [今日の食費]530円,残り4067円

本日のツッコミ(全121件) [ツッコミを入れる]

Before...

_ offizielle poker regeln [http://poker-9951.joueb.com/news/online-poker-texas-hold [..]

_ jeu slots casino gratuit [http://groups.google.fr/group/tegan2503/web/play-baccarat ..]

_ spiele bank [http://groups.google.de/group/muntaha9819/web/draw-poker [..]

_ cpayscom2 online casino [<a href=http://www.bloglines.com/blog/casino-4497?id=51>ju..]

_ baccarat spielen [<a href=http://blogs.iloha.net/casino7174/entries/19545.sh..]

本日のリンク元 | 75 | 31 | 22 | 21 | 16 | 15 | 10 | 10 | 9 | 9 | TrackBack(0)

2007-05-18

_ [今日の食費]1542円,残り2525円

切らしていた牛乳とか野菜を買出しに行ったので、高め。どうでもいいが、昼食にセブンイレブンで買った「とろけるチーズのミートドリア」の文字が一瞬「とろけるチーズのミトコンドリア」に見えてしまった。アホだ。

本日のツッコミ(全4件) [ツッコミを入れる]

_ lerpkrty [<h1>si ripete il passo 2 e il passo 3 e si vede il proprio..]

_ bestkasinonet [<H1>Stellt sich im praktischen Spiel heraus, dass von eine..]

_ grossman [<h1>Ci sono forse limiti al modo in cui potreste spenderli..]

_ numoewll [<h1>Sono in verit� i giocatori italiani stessi che ne hanno..]

本日のリンク元 | 21 | 11 | 11 | 8 | 8 | 7 | 7 | 7 | 6 | 6 | TrackBack(0)

2007-05-19

_ [今日の食費]0円,残り2525円

今日は友人の結婚式&披露宴に出席。というわけで、昼食は披露宴で食べた。特にデザートの量が多くて、かなりおなかいっぱいになってしまったが、おいしかった。

本日のツッコミ(全2件) [ツッコミを入れる]

_ mayaqua [ご出席頂き、本当に有難う御座いました。食事の量が足りなかったらどうしようとガクブルだったので、そう言っていただけると..]

_ みずしま [こちらこそ、ご招待頂き、ありがとうございます。 同年代の友人の結婚式に出るのは初めてだったというのも ありますが、楽..]

本日のリンク元 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | TrackBack(0)

2007-05-20

_ [今日の食費]0円,残り2525円

本日のツッコミ(全2件) [ツッコミを入れる]

_ piennyobedy [It drug any pharmacist. Click trustworthy buy meridia 16 a..]

_ angel777com [鷹�瘠誤逶� 尖竇 [url=http://www.a-n-g-e-l.com]ハ鞐鳧蒹 virshi 關琿竇諤[/u..]

本日のリンク元 | 22 | 22 | 12 | 11 | 10 | 10 | 9 | 9 | 9 | 8 | TrackBack(0)

2007-05-21

_ [Java]Functional Programming Library in Java (1)

最近、研究に使うプログラムを作っていて、Javaで関数型プログラミングっぽい事をするライブラリが欲しくなったことが何度もあり、自分で作ってみたくなった。2005/10/03のエントリで、似たような事を書いていたが、まだ色々機能が足りなく、実用に使えるようなものにはなっていなかった。今回は実際に使えるライブラリを目指して作ってみたい。

実は、同じような事を行うライブラリとして、FunctionalJというものが既に公開されているが、これは個人的にイマイチ。

まずは、関数を表す型から作っていこう。これは、基本的には

interface Function<R, A> {
  R call(A arg);
}

というインタフェースさえあれば、あとはカリー化するなどしてどうとでもできるが、そういうのはさすがに実際に使いたいとは思えない。というわけで、関数の型は引数の数ごとに別に用意したいところ。ただ、普通使う関数では、せいぜい引数の数は6個が限度だと思うので、多めに見積もって8個程度インタフェースを用意すればいいか。具体的にはこんな感じ(実際にはAPIとして公開するために、各インタフェースは別ファイルに分ける必要があるが)。

package jp.gr.java_conf.mizu.flj;
interface Fn<R, A> {
  R $(A arg);
}
interface Fn2<R, A1, A2> {
  R $(A1 arg1, A2 arg2);
}
interface Fn3<R, A1, A2, A3> {
  R $(A1 arg1, A2 arg2, A3 arg3);
}
interface Fn4<R, A1, A2, A3, A4> {
  R $(A1 arg1, A2 arg2, A3 arg3, A4 arg4);
}
interface Fn5<R, A1, A2, A3, A4, A5> {
  R $(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5);
}
interface Fn6<R, A1, A2, A3, A4, A5, A6> {
  R $(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5, A6 arg6);
}
interface Fn7<R, A1, A2, A3, A4, A5, A6, A7> {
  R $(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5, A6 arg6, A7 arg7);
}
interface Fn8<R, A1, A2, A3, A4, A5, A6, A7, A8>{
  R $(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5, A6 arg6, A7 arg7, A8 arg8);
}

この辺はFunctionalJと基本的に同じだが、名前をかなり短めにしてあるのがポイント。この辺りの基本的なインタフェースは頻繁に使うだろうから、短い名前にしてもわからないということはたぶん無いだろうと思う。それよりも、これらの無名サブクラスを作ったときに記述が煩雑になる方が個人的には嫌だ。

2007/05/25追記:<>を&lt;と&gt;にエスケープするのを忘れていたせいで、型パラメータが消えていたので、訂正。

_ [今日の食費]1276円,残り1249円

食費も残り千円台になってしまった。食料は1週間分くらいは買い込んであるから、あと4日くらいなら十分かな。

本日のツッコミ(全2件) [ツッコミを入れる]

_ 斎藤ただし [ラスト、ファイト〜 >食費 あとASCII文字列のみのコメント/トラバを弾くくらいのフィルタはいかがでしょうか? ]

_ みずしま [だねえ。今のテキトーに書いた正規表現マッチングフィルター だと、通ってくるスパムが多すぎるし、そうした方がいいかも。..]

本日のリンク元 | 16 | 13 | 12 | 10 | 10 | 9 | 7 | 6 | 5 | 5 | TrackBack(1)

2007-05-22

_ [今日の食費]640円,残り649円

_ [今日の運動]ウォーキング,5.3km

夕食を食べてから、研究室に集合して、斎藤君と一緒に歩くことに。歩き始めた時点でかなり日が落ちていたので、半分くらい歩いた時点で周りは真っ暗。筑波大学のループ道路は、街灯がほとんど無い箇所があるので、その辺りを通ったときには、つまずかないように足元をかなり注意して歩く必要があり、ちょっと怖かった。

_ [その他]スパムフィルター

いい加減に(コメント/TB)スパムがうざくなってきたので、これまでのてきとーな正規表現マッチングによるフィルタリングではなく、斎藤君のお勧め通りに、本文がASCII文字しか含まないコメントをはじくようにしてみた。

_ [その他]twitter

どうでもいいけど、半月くらい前から一応twitterやってます。あまり書いてませんが、一応。 http://twitter.com/kmizu

本日のリンク元 | 289 | 37 | 31 | 21 | 12 | 11 | 8 | 8 | 7 | 6 | TrackBack(0)

2007-05-23

_ [Java]Functional Programming Library in Java (2)

今回は、タプルをどう表現するかについて考えてみる。まず簡単な方法としては、以下のようなクラスを一つだけ用意して、三つ以上の値を扱いたい場合は、Tuple<String, Tuple<Integer, Double>>のようにして扱うというのが考えられるが、これは使いづらいので却下。

class Tuple<T1, T2> {
  ...
}

というわけで、関数型を表現するときと同様、値の個数に応じて、別のクラスを作ることにする。タプルも関数型と同様によく使うと考えられるので、名前も短めにしておく。

class Tp<T1, T2> {
  private T1 at1;
  private T2 at2;
  Tp(T1 t1, T2 t2) {
    at1 = t1;
    at2 = t2;
  }
  public T1 at1() {
    return at1;
  }
  public T2 at2() {
    return at2;
  }
}

class Tp3<T1, T2, T3> { private T1 at1; private T2 at2; private T3 at3; Tp(T1 t1, T2 t2, T3 t3) { at1 = t1; at2 = t2; at3 = t3; } public T1 at1() { return at1; } public T2 at2() { return at2; } public T3 at3() { return at3; } } ...以下同様

さて、これだけだと、タプルを構築するときに毎回型パラメータを指定して、new Tp<Integer, String>のようにしなければならずうっとおしい。そこで、タプルを構築するために、以下のような多相メソッドを集めたユーティリティクラスも用意しておく。

class TpFn {
  public static <T1, T2> tp(T1 t1, T2 t2) {
    return new Tp<T1, T2>(t1, t2);
  }

public static <T1, T2, T3> tp(T1 t1, T2 t2, T3 t3) { return new Tp<T1, T2, T3>(t1, t2, t3); } }

ユーティリティメソッドを使うときは、static importしておけば単に 以下のように呼び出せばOK。

Tp<String, Integer> t = tp("Hello", 1);
本日のツッコミ(全1件) [ツッコミを入れる]

_ soutaro [普通tupleというと、A×B×CとA×(B×C)は別物なので、たくさんクラスTp1, Tp2, ...と用意するほ..]

本日のリンク元 | 44 | 18 | 18 | 14 | 13 | 12 | 12 | 12 | 11 | 11 | TrackBack(0)

2007-05-24

_ [今日の食費]780円,19220円

食費つけはじめてから1ヶ月たったので、残額リセットですよ。K山さんがせっかくつくばに来てくれたので、RanRanの洗礼を受けさせよう、というM田先生の提案によって、M田先生、K山さん(初RanRan)、斎藤君とRanRanへGo。K山さんの注文にinterruptしてBIG丼大盛にしたM田先生の早業に感服。それを普通に平らげたK山さんにも感服。俺はもちろんダイエット中なので、ねぎとろ野菜丼というカロリー低そうなメニューにしました。ダイエット中にRanRanに行くという選択が既に何か間違えている気がしなくも無いがキニシナイ。1日くらい大丈夫だ、たぶん。

BIG丼大盛を完食したK山さん

本日のリンク元 | 181 | 96 | 52 | 36 | 31 | 30 | 30 | 26 | 25 | 22 | TrackBack(0)

2007-05-25

_ [今日の食費]2000円,17220円

今日はもやしパーティ(?)。とにかく、辛もやしを作って作ってつくりまくって、食いまくろうという企画。というわけで、カワチでもやしを17袋購入して、ひたすら作りまくった(作り方はココを参考にした)。食費の2000円の内、ほとんどはこれを作るための調味料代だったりする。

本日のリンク元 | 43 | 37 | 28 | 28 | 16 | 13 | 10 | 8 | 8 | 8 | TrackBack(0)

2007-05-26

_ [今日の食費]1340円,15880円

一週間分の牛乳や焼きそばを買いだめ。

 
本日のリンク元 | 3 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | TrackBack(0)

2007-05-27

_ [今日の運動]ジョギング,5.3km

斎藤君に誘われて参加。今日はいつもより参加者が多く、自分、斎藤君、佐々木さん、清水さん、yoosakiさんの計5人。走るのは久しぶりだが、ペースはゆっくりめだったので、気持ちよく走れた。

_ [今日の食費]1013円,14867円

本日のリンク元 | 1 | 1 | 1 | 1 | 1 | 1 | TrackBack(0)

2007-05-28

_ [今日の食費]0円,14867円

本日のリンク元 | 2 | 1 | 1 | 1 | 1 | TrackBack(0)

2007-05-29

_ [今日の食費]849円,14018円

本日のリンク元 | 1 | 1 | 1 | TrackBack(0)

2007-05-30

_ [今日の食費]1500円,12518円

一月持ちこたえて気が緩んだか、最近、ちと外食し過ぎだ。もっと自炊するようにしよう。

本日のリンク元 | 4 | 1 | 1 | 1 | 1 | 1 | 1 | TrackBack(0)

2007-05-31

_ [Onion][Java][Nice]reduce(l|r)

404 Blog Not Foundより引用:

というわけで問題。reducelとreducerを実装せよ。制限時間はあわせて10分。ただし、reducelとreducerは、Haskellにおいて次の挙動を示すものとする。
*Main> reducel (\x y -> "("++x++"#"++y++")") $ map show [1..4]
"(((1#2)#3)#4)"
*Main> reducer (\x y -> "("++x++"#"++y++")") $ map show [1..4]
"(1#(2#(3#4)))"

というわけで、Onionでも実装してみた。以下がOnionによる解。0要素の場合、正しく動作しないが、問題でも0要素の場合の挙動は定められてないので、まあいいだろう。かかった時間は大体4〜5分くらい。やはり、function typeと、parameterrized typeが無いのが痛い。

interface Fn {
  _(arg1 :Object, arg2 :Object) :Object;
}

def reducel(fn :Fn, lst :List) :Object { it = lst.iterator; accum = it.next; while it.hasNext { accum = fn._(accum, it.next); } return accum; }
def reducer(fn :Fn, lst :List) :Object { it = lst.listIterator(lst.size); accum = it.previous; while it.hasPrevious { accum = fn._(it.previous, accum); } return accum; }
System::out.println(reducel( #Fn._(accum :Object, e :Object) { return "(" + accum + "#" + e + ")"; }, ["1", "2", "3", "4"] ));
System::out.println(reducer( #Fn._(e :Object, accum :Object) { return "(" + e + "#" + accum + ")"; }, ["1", "2", "3", "4"] ));

実行結果。

>onion reduce.on
(((1#2)#3)#4)
(1#(2#(3#4)))

おまけ:Java版

import java.util.*;

public class Reduce { interface Fn<R, A> { R _(A arg1, A arg2); }
static <A> A reducel(Fn<A, A> fn, List<A> lst) { Iterator<A> it = lst.iterator(); A accum = it.next(); while(it.hasNext()) accum = fn._(accum, it.next()); return accum; }
static <A> A reducer(Fn<A, A> fn, List<A> lst) { ListIterator<A> it = lst.listIterator(lst.size()); A accum = it.previous(); while(it.hasPrevious()) accum = fn._(it.previous(), accum); return accum; }
public static void main(String[] args) { System.out.println(reducel( new Fn<String, String>(){ public String _(String accum, String e) { return "(" + accum + "#" + e + ")"; } }, Arrays.asList("1", "2", "3", "4") )); System.out.println(reducer( new Fn<String, String>(){ public String _(String e, String accum) { return "(" + e + "#" + accum + ")"; } }, Arrays.asList("1", "2", "3", "4") )); } }

おまけ2:Nice版

package reduce;

<A> A reducel((A, A)->A fn, List<A> lst) { let it = lst.iterator; var accum = it.next; while(it.hasNext) accum = fn(accum, it.next); return accum; }
<A> A reducer((A, A)->A fn, List<A> lst) { let it = lst.listIterator(lst.size); var accum = it.previous; while(it.hasPrevious) accum = fn(it.previous, accum); return accum; }
void main(String[] args) { println(reducel((String accum, String e) => { return "(" accum "#" e ")"; }, ["1", "2", "3", "4"])); println(reducer((String e, String accum) => { return "(" e "#" accum ")"; }, ["1", "2", "3", "4"])); }
void main(String[] args) { println(reducel((String accum, String e) => { return "(" + accum + "#" + e + ")"; }, ["1", "2", "3", "4"])); println(reducer((String e, String accum) => { return "(" + e + "#" + accum + ")"; }, ["1", "2", "3", "4"])); }

おまけ2-2:Nice版その2。Niceにはせっかくマルチメソッド+syntax sugarによって、既存のクラスにメソッドを追加したように見せかける機能があるのだから、こっちの方がNiceらしい、かも。

package reduce;

<A> A reducel(List<A> lst, (A, A)->A fn) { let it = lst.iterator; var accum = it.next; while(it.hasNext) accum = fn(accum, it.next); return accum; }
<A> A reducer(List<A> lst, (A, A)->A fn) { let it = lst.listIterator(lst.size); var accum = it.previous; while(it.hasPrevious) accum = fn(it.previous, accum); return accum; }
void main(String[] args) { println(["1", "2", "3", "4"].reducel((String accum, String e) => { return "(" accum "#" e ")"; })); println(["1", "2", "3", "4"].reducer((String e, String accum) => { return "(" e "#" accum ")"; })); }

_ [Nemerle]マクロでreduce(l|r)

Nemerleでも書いてみた。せっかくNemerleで書くのだから、マクロを使って書いてみることに。

public class Reduce {
  public static reducel[T](fn :(T * T)->T, lst :list[T]) :T{
    def foldl[T2, V](fn :(V * T2) -> V, init :V, lst :list[T2]) :V{
      match(lst){
      | [] => init
      | x::y => foldl(fn, fn(init, x), y)
      }
    }
    match(lst){
    | x::y => foldl(fn, x, y)
    }
  }
  public static reducer[T](fn :(T * T)->T, lst :list[T]) :T{
    match(lst) {
    | [x] => x
    | x::xs => fn(x, reducer(fn, xs))
    }
  }
}

macro Reducel(expression, lst){ def l = "left"; def r = "right"; <[ Reduce.reducel(fun($(l :usesite), $(r :usesite)){ $expression }, $lst) ]> }
macro Reducer(expression, lst){ def l = "left"; def r = "right"; <[ Reduce.reducer(fun($(l :usesite), $(r :usesite)){ $expression }, $lst) ]> }

マクロを使う方は次のような感じ。

using System;
Console.WriteLine(
  Reducel("(" + left + "#" + right + ")", ["1", "2", "3", "4"])
);
Console.WriteLine(
  Reducer("(" + left + "#" + right + ")", ["1", "2", "3", "4"])
);

_ [今日の食費]400円,12118円

本日のリンク元 | 127 | 65 | 42 | 36 | 20 | 18 | 16 | 13 | 13 | 12 | TrackBack(0)

Mizushima Kota/e-mail: i021216{at}coins.tsukuba.ac.jp/SKype ID: mizu_standard

AC部屋(Lingr)

kanbayashi君に頼まれたので、貼ってみました。