2005年11月04日
_ ICPC2日目
コンテスト本番。外野で観戦するのも結構楽しいものでした。
その後交流会で騒ぐ。13位でしたがチームメンバーは来年もやる気のようです。 やる気を継続させるのは難しいものですが努力してほしいです。
2005年11月05日
_ ICPC3日目
最後にボーリングを楽しむ。ろくに投げていないのに翌日手が痛くなってしまった。
その後東京の友達のところに遊びに行く。先輩の引越し祝いに参加し 鍋を食べた。東京に行ってしまった人々と会え、実に楽しかった。
2005年11月13日
_ Concurrent Clean
最近 Concurrent Clean をいじりはじめたのですが、 Clean Game Library が Windows 以外で 動かないらしくかなりやる気が萎えてきました。あと Linux での GUI が Xview/OpenLook でそれは古臭い。
そういうライブラリ関連を除けば結構良さそうです。
2005年11月16日
_ Rubyist Magazine 0011号
私も解説 Ruby Refactoring Browser - Ruby Refactoring Browserの組み込みという記事を書いて います。是非読んで新しい環境でRuby Refactoring Browserを使えるようにしてください。
2005年11月20日
_ Rubyのproc
以下のようなものを思いついた。
def bind(sym, *p1) proc{|*p2| obj, *args = *(p1+p2); obj.__send__(sym, *args)} end class Symbol def to_proc proc{|obj, *args| obj.__send__(self, *args)} end end
これで、
(1..10).inject(&:+) # => 55
とか
(10..20).map(&bind(:*,3)) # => [30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]
とかできる。
と思っていたら Symbol#to_proc のほうは Ruby/Extensions に同じものがあった。
2005年11月22日
_ 続関数型言語でゲーム
以前、関数型言語でゲームが作りにくいという話を しました。で、その問題をある程度解決する手段を思いついたので書いておきます。 以下のコードはCleanのコードです。
まず、なにが問題かというと、
// two records :: A1 = { x :: Real, y :: Real } :: A2 = { x :: Int, y :: Int, dx :: Int, dy :: Int }
という二つのレコード型がある場合、xというフィールド名がかぶっているので、 それにアクセスする場合、a.A1.xやb.A2.xと書く必要があるのが面倒であることです。 Haskellでは同じことをしようとするとコンパイル時にエラーがでますし、OCamlでは A1が使えなくなったりします。発生する現象は異なりますが根本的な問題は同じです。
そこで、型クラスを使い以下のような多重定義関数を作ります。
class x_ a b :: a -> b instance x_ A1 Real where x_ {A1| x} = x instance x_ A2 Int where x_ {A2| x} = x
すると、
x_ {A1| x=1.0, y=2.0}
や、
x_ {A2| x=3, y=4, dx=5, dy=6}
といったことができます。
型クラスの定義や多重定義関数の定義は数が増えた場合ソースコードジェネレータで 生成したほうが楽でしょう。
Haskellだと型クラスにいちいち名前を付けるぶん面倒が増えますが同じことができる でしょう。OCamlはこのまま適用はできないので G'Camlを使うか、 関数ローカルな空間に x_ のような関数を定義するといった方法をとる必要が あるでしょう。
_ 工科大のRuby好き [ICPCで工科大できてましたか.お疲れ様です. 一度お会いしてお話したかったです. ここで情報をくれれば・・・残念...]
_ ohai [それは残念。そういえば日記に今後の予定とかを書いておけば そういう効果も期待できるんですね。]