Nop いらなくないですか。 then に関して。

ioNop 面白い…けどいらない。

write(Nop, "\n")
write(Nop protos, "\n")
Nop hello := method(write("hello\n"))
Nop hello

なんてしても何も起きない。 Nil よりはるかにやる気のないオブジェクト。ニートっぽい。というか Nil は将来に対する期待に満ちあふれている。だって else に反応するし。

一引数 if はいらない。 if (val == 1) then と (val == 1) then は等価だから。

ところで昔は Object#then は Nop じゃなくてブロックを評価した値を返しててこらダメやんと思った記憶があります。

いやでも。

mode := if (modeStr == "640x480") then (0) else (1)

とかしたくないですか…ってことでやっと本題。

Object then = method(v,
  v then := method(self)
  v
)
Object elseif = method(self)
Object else = method(self)

これでできるようになった。あと、

(a == 1) then (...) else (...) else (...)

とかする子はママの子じゃありません。

まぁこの実装だとさっきの例で言う mode に対して then が呼ばれると通常と逆挙動になっちゃうからダメ、ってのはあるけど…

Nop いらなくないですか。 isWaitingFuture に関して。

あと ioNop が使われているのは Future#isWaitingFuture にて。とりあえず

http://d.hatena.ne.jp/shinichiro_h/20040928#1096336174

がうまく動かなくなってた。 Future#? すると Future が即評価されてる。

で、ちょっと調べるとむしろ ? がいらない模様。 piResult isWaitingFuture するとちゃんと回る。でも今度は Object#isWaitingFuture が無いから最後に例外が飛ぶ。ちゃんと Object#isWaitingFuture を実装してください…

Future isWaitingFuture = method(1)
Object isWaitingFuture := method(Nil)

これでいいと思う。 Nop 不要。

if の話も解決できた気がした

Object then = method(v, v)
Object elseif = method(
  self then = method(
    self then = method(v, v)
    self
  )
  self
)
Object else = method(self)

modeStr := "640x480"
//modeStr := "800x640"
//modeStr := "1024x768"

mode := if (modeStr == "640x480") then (
  write("VGA\n")
  1
) elseif (modeStr == "800x640") then (
  write("SVGA\n")
  2
) else (
  write("XGA\n")
  3
)
write(mode, "\n")

if (mode) then (
  write("mode is set!\n")
)

これで、 elseif と then がセットで呼ばれる限りにおいては、一連の if の帰り値が普通のオブジェクトであることが保障されている、と思う。

brainf*ck.io

時代は DSL ですよね。 K.INABAさんとこを参考にしました (http://www.kmonos.net/alang/etc/brainfuck.php)

vm := List clone
for(a, 0, 100, vm push(0))
index := 0

through := method(s, m,
  if (m,
    a := m argAt(0)
    if (a, s doMessage(a))
  )
)
setSlot(">", method(
    index = index + 1
    through(sender, thisMessage)
))
setSlot("<", method(
    index = index - 1
    through(sender, thisMessage)
))
setSlot("+", method(
    vm atPut(index, vm at(index) + 1)
    through(sender, thisMessage)
))
setSlot("-", method(
    vm atPut(index, vm at(index) - 1)
    through(sender, thisMessage)
))
setSlot(".", method(
    write(vm at(index) asCharacter)
    through(sender, thisMessage)
))
// i cannot implement ","
setSlot("'", method(
    vm atPut(index, File standardInput readBufferOfLength(1) at(0))
    through(sender, thisMessage)
))
setSlot("squareBrackets", method(
    while (vm at(index) != 0,
      sender doMessage(thisMessage argAt(0))
    )
    self
))

// hello world
 > + + + + + + + + + [ < + + + + + + + + > - ] < . > + + + + + + + \
 [ < + + + + > - ] < + . + + + + + + + . . + + + . [ - ] > + + + + + + + + \
 [ < + + + + > - ] < . > + + + + + + + + + + + [ < + + + + + > - ] \
 < . > + + + + + + + + [ < + + + > - ] < . + + + . \
 - - - - - - . - - - - - - - - . [ - ] > + + + + + + + + \
 [ < + + + + > - ] < + . [ - ] + + + + + + + + + + .

// echo
 + [ > ' . < ]

brainf*ck.io の続き

#!/usr/local/bin/io

doFile("bf.io")

>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++
[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.
[-]>++++++++[<++++>-]<+.[-]++++++++++.

以下 bf.io

vm := List clone
for(a, 0, 100, vm push(0))
index := 0

through := method(s, m,
  if (m,
    a := m argAt(0)
    if (a, s doMessage(a))
  )
)
setSlot(">", method(
    index = index + 1
    through(sender, thisMessage)
))
setSlot("<", method(
    index = index - 1
    through(sender, thisMessage)
))
setSlot("+", method(
    vm atPut(index, vm at(index) + 1)
    through(sender, thisMessage)
))
setSlot("-", method(
    vm atPut(index, vm at(index) - 1)
    through(sender, thisMessage)
))
setSlot(".", method(
    write(vm at(index) asCharacter)
    through(sender, thisMessage)
))
// i cannot implement ","
setSlot("'", method(
    vm atPut(index, File standardInput readBufferOfLength(1) at(0))
    through(sender, thisMessage)
))
setSlot("squareBrackets", method(
    while (vm at(index) != 0,
      sender doMessage(thisMessage argAt(0))
    )
    self
))
setSlot("..", method(
    self perform(".")
    self perform(".")
    through(sender, thisMessage)
))

setSlot("forward", method(
    thisMessage name foreach(i, v,
      self perform(v asCharacter)
    )
    through(sender, thisMessage)
))
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h