憂鬱な勇者 in ioLanguage

憂鬱な勇者というものがあるらしいので、ioLanguageで作ってみた。
参考:http://d.hatena.ne.jp/hrkt0115311/20080527/1211891558憂鬱な勇者とは - はてなキーワード

MelancholicValiant.io

utf-8に変換して、保存してください。
こちらの乱暴な環境では日本語が化けるので、一部英語にしています。
階乗計算を「level!」みたいに求めるところと、勇者のレベルが30に達すると、メソッドそのものを書き換えるってのがポイントか。何というか、若いころにはもう戻れない人生観をコードで表してみましたw
メッセージを出すところはAOP風に出来ないもんだろか。

//数値オブジェクトに階乗を返すスロットを追加
Number ! := method(if(self == 0, 1, self * (self - 1) !))

//ListオブジェクトにNilではない何かを返すスロットを追加
List anyOneNotNil := method(at(Random value(0,size-1) floor))

//モンスターのプロトタイプ
Monster := Object clone do (
    NAMES := list("焼きたてパン","強いシャチホコ","もんじゃ焼き一年生","怪人ホタテ男","ニセ勇者","逃げ足の早いアレ","睡魔","煩悩","愛らしい子犬の中の人","恋するスズメバチ","勇敢なクマンバチ","信じられない物","勇者の師匠","浮遊する鎧","怪盗ドボン","闇の招き猫","誘惑のカスタードクリーム","しょっぱすぎる籠手","カレー味の兜","光沢だけは一流の盾","若葉マークのモンスター","新緑の季節","梅雨時の車両のニオイ","暑すぎる夏","新宿らしき何か","やたら発達したドーナツ","育ちすぎたクマー","なごやかな雰囲気","凍り付いた気配","忍び寄る恐怖")
    SKILLS := list("お豆腐の買い方","鉛筆の買い方","消しゴムの使い方","メモの取り方","攻撃に使えないこともない呪文","裏町の歩き方","森林浴","珈琲の味","しじみのみそ汁の作り方","回覧板の回し方","郵便物の投函方法","立ち話のコツ","猫の呼び方","犬の呼び方","カラスの呼び方","鳩専用豆鉄砲","秘密の趣味","速く走るコツ","剣の使い方","斧の使い方","まきわりで、まっきわりわり","聖なる祈り","孤独","涼しく過ごすコツ","お洒落のコツ","卵をふわっと焼く方法","ごはんの研ぎ方","油汚れの対応方法","大人の振るまい","Suicaの使い方")
    level := 0
    
    init := method(
        Monster level = level + 1
        
        self name := NAMES anyOneNotNil
        self skill := SKILLS anyOneNotNil
        self exp := level!
    )
)

//勇者そのもの
Valiant := Object clone do (
    name := "Valiant"
    level := 1
    exp := 0
    skills := List clone
    
    getSkill := method (skill,
        self skills atInsert(0, skill)
        "#{self name} got skill #{skill}" interpolate println
        self
    )
    
    getExp := method(exp,
        self exp = self exp + exp
        "#{self name} got #{exp} exp !" interpolate println
        self
    )
    
    increaseLevel := method (
        self level := level + 1
        "level up to #{self level}!" interpolate println
        if (level == 30,
            self getSkill = method (skill,
                self skills atInsert(0, "vanity")
                "#{self name} got skill vanity" interpolate println
                self
            )
        )
    )
    
    killedAMonster := method (aMonster,
        "#{self name} killed #{aMonster name} !" interpolate println
        self getExp(aMonster exp)
        self increaseLevel
        self getSkill(aMonster skill)
        self
    )
    
    meetsANewMonster := method (
        "*-----" println
        ANewMonster := Monster clone
        killedAMonster(ANewMonster)
        self
    )
    
    //旅をする
    onJourney := method (
        "And, the adventure continued on peaks and valleys in the such and such by so and so , but omit it." println
        meetsANewMonster
        self
    )
)

使い方

ioを起動して、以下のコマンドを打ちます。レベル上げは手動です。

  1. doFile("MelancholicValiant.io")
  2. Valiant onJourney
  3. Valiant onJourney
  4. Valiant onJourney
  5. Valiant onJourney...

そして空しさだけが残ります。
空しさの再確認は、「Valiant skills」からどうぞ。
個人的にはレベル160ぐらいで空しくなって、止めました。

参考に、乱暴なio環境構築 on win32

  1. http://homepage.mac.com/jamesrburgess/Stuff/からIo-2008-01-07.win32.zipを落とし、c直下に展開する。「c:\usr\local\...」という感じに。(ioのAddonLoaderのサーチパスの関係で。直せる人なら、適当でいい。はず。)
  2. コマンドプロンプトから、「cd c:\usr\local\bin」
  3. 続けて、「io」

で、iovmが起動するはずです。