トップ «前の日(11-21) 最新 次の日(11-23)» 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|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|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2004-11-22 くじけるな子供たち

% [雑談] HAPPY TREE FRIENDS (リンク先は非公式ファンサイト)

某氏に教えられたサイトだが……ひどすぎる!!……良い意味で(爆

パッと見、子供向けだけど、とてもじゃないが子供には見せられませんね(笑)。まあ、あーゆー危険行為をするとヒドイ目に遭うんだよっていう、戒めにはなるのかもしれないが(苦笑

いかにもイギリスっぽい (イギリスの作品かどうかは知らんが) ブラックユーモアがたっぷりです。…ひどすぎるけど(笑)。間の取り方とかが素晴らしい。…ひどすぎるけど(爆


2005-11-22

% [雑談] アップルのiMac G5欲しい!

なんか知らんけど、最近はてなでこの文句を見かけるんで何かと思ってたんだが、こういうことだったのか。 はてなじゃない人にもくれれば良いのに(ムリ

% [PC] C++の不思議な世界 - 2度目は意味が違う([鍋]鍋あり谷あり)

わはは、C++ 気持ち悪すぎ。 やっぱ真っ当なコードを書こうと思ったら、それなりに命名規則は必要だよね。 名前重要。

演算子オーバーロードなんて、難読コードコンテストのために存在するんではないのかと(笑

% [雑談] プログラマは 0 から数える?

某所のブログにはサブタイトル(?)として『プログラマは0から数える』って書いてある。 その言葉にことさら異を唱えるつもりは無いが、本当のプログラマは『0 かそうでないかだけ考える』ものなんじゃないかと思ったりもする。

『0』じゃなくて『無』とか『null』とかの方が良いかな。 『プログラマは数えない』とかもアリかも。 数えるのは常にコンピュータである。 と言うか、そうさせるべきである。とかね。

% [本日のリンク元] Google 検索 (xs ocaml)

パターンマッチを持たない言語(ぶっちゃけ非関数型言語)しか経験が無くて、初めて OCaml の勉強をし始めた人が、

let rec f lst =
  match lst with
    [] -> ...
  | x :: xs -> ...

みたいなのを見て、「xs って何だよ〜」とか疑問に思ったというストーリーを想像した。 つーか、実際わしがそう思ってた(笑

match の使い方がわかってないと、これって何か意味があるもののように思えちゃうんだよね。 実際は単なる名前付けなわけだけど。 たぶんこれって、

何か一つの要素 = x
x が複数集まったもの(複数形) = xs

ぐらいの意味なんでしょ? いや、もしかしたらもっと由緒ある由来が無いとは限らないけど。

ところで、こんな話は全然関係なくて、実は OCaml と Perl を連携させる話でした……とかだったりしないよね?

% [雑談] どうしても言っておきたいこと

エチルアルコールは二日酔いの香りがする。 うぅ、飲んでもいないのに具合悪い。

% [OCaml] 相互に参照するメソッド

ラッパークラスネタに関する soutaro さんとこのエントリで、なにやら訂正が入っていたものの、何をどう勘違いしていたのかがわからなかったんでスルーしてた。 …ら、実はコメントで少しやり取りがあったみたいなのに今さら気付いた。 はてなはコメントが RSS で流れないんで気付かなかったよ...orz

んでまあ、sumii さんが指摘しているとおり、相互に参照するメソッド自体は定義できる。 できるんだけど、例の eq クラスのようなものを作る場合にはちょっと問題があって、例えば素直にこうすると…

# class eq =
  object (self)
    method eq o = not (self#neq o)
    method neq o = not (self#eq o)
  end;;
Some type variables are unbound in this type:
  class eq : object method eq : 'a -> bool method neq : 'a -> bool end
The method eq has type 'a -> bool where 'a is unbound

こうなる。 要するに、eq の型が 'a -> bool になるんで型が不定ですよってこと(そーゆー場合は多相型のクラスにしないといけない)。 こういう場合、何とかするためには二つの方法があって(厳密には三つ目もあるが、どうせ役に立たんのでとりあえず無視)、

(* その1:メソッドに型指定を入れる方法 *)
# class eq =
  object (self)
    method eq (o : eq) = not (self#neq o)
    method neq o = not (self#eq o)
  end;;
class eq : object method eq : eq -> bool method neq : eq -> bool end
(* その2:多相クラスにする方法 *)
# class ['a] eq =                 
  object (self)                   
    method eq (o : 'a) = not (self#neq o)
    method neq o = not (self#eq o)       
  end;;                                  
class ['a] eq : object method eq : 'a -> bool method neq : 'a -> bool end

こんな感じかな。 んで、このクラスがこれだけで完結するなら良いんだけども、これを継承して云々ってなってくるといろいろと問題がある。 特に一つ目なんかはメソッドのオーバーライドもろくにできないんで泣けること請け合い。

# class ['a] base n =
  object 
    inherit eq
    val v : 'a = n
    method get = v
    method eq o = v = o#get
  end;;
This expression has type eq
It has no method get

# class ['a] base n =      
  object                   
    inherit eq             
    val v : 'a = n         
    method get = v         
    method eq (o : 'a base) = v = o#get
  end;;
This expression has type 'a base
It has no method get

eq クラスに get : 'a なメソッドを作っとけば良いかも知れないが、それなら結局多相クラスにしなきゃならないし、等値比較を目的として分けてあるクラスなのに get って何だよ、みたいなことにもなってうれしくない。

二つ目だと、

# class ['a] base n =
  object     
    inherit ['a] eq
    val v : 'a = n
    method get = v
    method eq o = v = o#get
  end;;
class ['a] base :
  'a ->
  object
    constraint 'a = < get : 'a; .. >
    val v : 'a
    method eq : 'a -> bool
    method get : 'a
    method neq : 'a -> bool
  end

てな感じで一瞬うまくいったと思うんだが、実際は型情報をよく見るとわかるとおり…

# let o = new base 1;;
This expression has type int but is here used with type
  < get : 'a; .. > as 'a

こんな風になるんでダメ。 なんとかするには base クラスを…

# class ['a, 'b] base n =   
  object                   
    inherit ['a] eq        
    val v : 'b = n         
    method get = v         
    method eq o = v = o#get
  end;;
class ['a, 'b] base :
  'b ->
  object
    constraint 'a = < get : 'b; .. >
    val v : 'b
    method eq : 'a -> bool
    method get : 'b
    method neq : 'a -> bool
  end

こうしないといけない。 この後、継承するたびにいちいち 'a だの 'b だのが、どれに対応してどうのこうのと考えなきゃならなくてやっぱりうれしくない。 少なくとも、eq クラスのためにこんな苦労をするのはバカバカしいと思う。

ちなみに二つ目の方法は、この時に「どうにもうまくいかなかった」と書いたあとに思いついたんだけど、例のサンプルを書く時点で思いついてても採用しなかったと思う。

% [OCaml] 自分自身を参照する際の制限

クラス定義内で自分自身を参照する場合には、自分自身を静的な型の値として扱えないという制限があるらしく、例えばこんなクラスは定義できない。

# class hoge =
  object (self)
    val mutable obj : hoge option = None
    method me_or_other =
      match obj with
      | None -> self
      | Some o -> o
  end;;
This expression has type hoge but is here used with type
  < me_or_other : 'a; .. >
Self type cannot escape its class

要するに、ここで self は hoge クラスであることは明白なのに、hoge クラスであるとみなされない。 人間の目からは self も new hoge も同じ型なのに、型が一致しないってことになってしまうのだ。 わしはこれで一度切ない思いをした……まあ、それは良いや。

ちなみにこの件はマニュアルの Reference to self セクションの末尾辺りに載ってるが、そこを見てもわかるとおり一応回避策が無いこともない。

# let hoge =                            
  object (self)                         
    val mutable obj = None              
    method me_or_other =  
      match obj with      
      | None -> self      
      | Some o -> o       
  end;;                   
val hoge : < me_or_other : 'a > as 'a = <obj>

いつの頃からか存在するオブジェクト式とかいうやつで、クラス定義じゃなくオブジェクトを直接作ってしまっている。 活用する場合は Cloning objects が参考になるかも。 当然のことながら、型ではないので継承とかはできない。

ちなみにさっきのネタで書いた三つ目の方法ってのはこれ。 継承できないから、アレの役には立たないが、一応書いとくとこんな感じで作れる。

# let eq =
  object (self)
    method eq o = not (self#neq o)
    method neq o = not (self#eq o)
  end;;
val eq : < eq : 'a -> bool; neq : 'a -> bool > = <obj>
# eq#eq eq;;
Stack overflow during evaluation (looping recursion?).

% [OCaml] 相互に参照その2

soutaro さんから的確な意見が返ってきて目から鱗。 また一つ賢くなった。

あー、でもそうするとさっきの自分自身を参照する問題の大多数はこれで救えるんでは?と思ってやってみた。

# class hoge =
  object (self : 'a)
    val mutable obj = None
    method me_or_other : 'a =
      match obj with
      | None -> self
      | Some o -> o
  end;;
class hoge :
  object ('a) val mutable obj : 'a option method me_or_other : 'a end

でけた。 まだまだ修行が足りないことを実感した、2005 年初冬であった、マル。

% [雑談] あら〜

mod 演算子は modulo の略か……ほんと物知らねえな、わし。 まあ、語源は同じだから moduli でもかすってはいるのかな。

いや、この前のサンプル書いた時に、「modulo だっけ? moduli だっけ?」って悩んだ挙げ句、結局 moduli にしたっていう経緯があって、(あの時は即興だったんでちゃんと調べなかったから)今回ちゃんと調べてみたらそんな感じだったというお話。

英語苦手……数学も(駄目

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

% sumii [「二つ目」は単に↓の書き間違いだったりしないでしょうか? class ['a] base n = object..]

% jijixi [ああ、確かにこの例だとこれで良いんですね。 ただ継承先のクラスでいろいろ多相値を持たせたいときに、eq クラスのため..]


2006-11-22

% [雑談][game] PS3 に縁は無いが…

まー一応ってことで PSP のファームウェアアップデートとか。

バッテリーの残量が足りません

まただよw

% [雑談][game] せっかくアップデートしたのに、速攻でバグフィックス版出てるし……

ほんともうソニーはだめぽ。 『JEANNE D'ARC』とかいうゲームを買うつもりは全然無いのでスルーだな。 めんどくさいし。

……つーか、こんな微妙な互換性問題が出るってことは、他のソフトでも何かしら問題が出そうな気がしないでもないんだが、はてさて。


2007-11-22

% [雑談] 巷で話題の http://speedtest.10-fast-fingers.com/ をやってみたが、結果を表示する段階で Safari が落ちた件

テラションボリ。

たぶん 50 個くらいは行ったと思うんだけど。 まあ、あんまり難しい単語が出てこないので、わしのように英語力が微妙 (婉曲表現) な人間にも何とかなるレベルではあるような。

sometime とか someone とか somewhere とかで、つい some のあとにスペース押しちゃうクセは、以前から気にしてたんだけど、こういうゲームでは思いっきり障害になるな(苦笑

ともあれ、タイピングゲームとかって別に好きでも何でもないんだけど、これは何というか進み方が小気味良いんで結構楽しかった。 まあ、一回やれば十分だけど。

% [Gauche][Scheme][DouKaku] 文字列の反転(括弧の対応を保存)

たまに無性に Scheme のコードを書きたくなることがある。 なので、昨日の Ruby のコードを移植。→ #4341

相変わらず util.match 使いまくり。 つーか、これ無しで書くなんて考えられない。

最初はもっと完全に直訳でいけると思ったんだけど、Array#flatten の代替が見あたらなくて断念。 flatten の真っ平らにする挙動って LISP 由来だと思ってたんだけど、Scheme には無いのかね。 CommonLisp にはあるのかな。

format の第一引数を省略したときの挙動を勘違いして、省略すると #t だと思い込み、「変だな〜何も表示されないな〜」と悩んだのは内緒だ。

% [Gauche][Scheme][DouKaku] 自然数の分割

さっきので Gauche のリハビリが完了したので (元々大したレベルじゃないけど) 今度は元ネタ無しでチャレンジ。→ #4344

リストのネスト段数の辻褄がなかなか合わせられなくて死亡...orz

やっぱ、こういうの書くときは静的型付け言語の方が楽だと思う。 で、ぐちぐち文句良いつつなんかものすごく時間かかって、ようやく完成させて、えいやっと投稿して、そして……

#4317 を見て絶望...orz

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

% shiro [CLにも無かったと思います。Lisp/Schemeではリストにタプル、シーケンス、集合、連想リストなどいろいろな意味..]

% jijixi [なるほど。 > リストにタプル、シーケンス、集合、連想リストなどいろいろな意味を持たせていて Ruby でも状況..]


2008-11-22

% [game] クロノトリガー DS 日記、クロウリーさま

クロウリーさまのセリフが「コナゴナしてやる〜」じゃなく「コナゴナしてやる〜」になってる。 あれって誤植だったのか。 なんか意味不明なアホっぽさがあって結構納得してたのに。 懐古厨としては誤植だったとしても敢えて直さないでほしかったな :-p

PS 版はどうなってたっけね。 つーかクソロードのおかげで序盤でイヤになってディスク叩き割ったような気がするけど。 (うそうそ。速攻で売り払っただけ)

% [雑談] マクロス F DVD 第 4 巻

初回特典、映画鳥の人のパンフレットにミランダ・メリンがジャミス・メリンの孫だと書いてあった。 そうではないかと言われてたけど、明言されたのはこれが最初だよね、たぶん。

スタッフ&キャストのところが結構遊んでて笑える。 ロイ・フォッカー役が「パイン・S・ハラダ」とかコーヒー吹くわ。 あと音楽:ヨーコソ・カノンとか、配給:マヤンダイビジュアルとかアホすぎw 他にもパッケージの裏面 (本物のスタッフ) と見比べてみると結構おもしろい。


トップ «前の日(11-21) 最新 次の日(11-23)» 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com