クラスないの?

Windows VistaMonadが搭載されない*1というので安心して放置してたんだけど、知らない間にβ3*2まできてしまったのでちょっと遊んでおくことにした。id:newpopsさんのところに日本語での解説が多くあり非常に助かります。

ところでクラスの定義はできないんだろうか?聞き方が悪いのかGoogle先生も教えてくれない。VBScriptにも一応あるのにMonadにないってのは信じられないんだけど…。他の言語でアセンブリを作って呼び出したりはできそうだけどそれも違うし…。

生成後のオブジェクトにプロパティやメソッドを動的に追加できるので、クラスっぽく(というかクラスをインスタンス化したオブジェクトっぽく?)は扱える。

#
function Test() {
  $i1 = NewInteger
  $i2 = NewInteger 10

  $a = new-object Collections.ArrayList
  [void]$a.Add($i1)
  [void]$a.Add($i2)

  foreach ($i in $a) {
    $i.Incl()
    $i.Decl()
    write-host $i
  }
}

#
function NewInteger([int]$value = 0) {
  $o = new-object Management.Automation.MshObject
  $o = add-member -i $o -t NoteProperty -n Value -va $value
  $o = add-member -i $o -t ScriptMethod -n Incl -va { ++$this.Value }
  $o = add-member -i $o -t ScriptMethod -n Decl -va { --$this.Value }
  $o = add-member -i $o -t ScriptMethod -n ToString -va { "value = " + $this.Value } -f
  return $o
}

#
Test
D:\Temp>cl.msh
value = 0
value = 10

うーん、いけてないっす。