バグ修正 Befunge

http://d.hatena.ne.jp/tkuro/20081224/1230129169
ちょっと前のトピなんだけど、befungeのruby実装について、いわもとさんからバグ報告もらった。使ってみてくれただけでもうれしいのに、これはとてもうれしい。

  1. コードが書かれていない位置にput(p)すると落ちる
  2. デバッグモード(-d)の時、文字の無い位置に行くと落ちる。
  3. スタックが空の時にpopすると、nilが得られる。(仕様では0)
  4. swap(\)でスタックに変化が無い
  5. |の動作が上下逆

1,2は同じ原因。初期プログラム分だけ確保すればよいのかなあ?とか少し曖昧だけど、とりあえずプログラム読むところで

      @prog = prog.split("\n")
      @width  = @prog.map {|l| l.length}.max
      @prog  = @prog.map {|l| l.ljust(@width)} # ここ

とか小手先修正でもいいのかな。と甘く考える。3は恥ずかしい。単に Array#popなのでこうなる。かっこ悪い解決策しか考え付かない。

4,10d2
>     class Stack < Array
> 	def pop
> 	    v = super
> 	    v ? v: 0
> 	end
>     end
>
58c50
<       @stack = []
---
>       @stack = Stack.new

4,5はもっともっと恥ずかしい。逆だ逆。

89c89
<       @stack.push(@stack.pop,t)
---
>       @stack.push(t, @stack.pop)
138c146
<          when ?|              then changedir(@stack.pop,    UP, DOWN)
---
>          when ?|              then changedir(@stack.pop,  DOWN, UP  )

4のついでに3もテスト

"fb"\,,"fb",,..@
% ./befunge.rb p.bf
fbbf00

おk。

          • -

ふと、前に聞いたVOAジェシーオーエンスの記事を思い出した。

It is important to choose a goal and always work toward it. That there are good people in the world who will help you to reach your goal. That if you try again and again, you will succeed.

ベルリンオリンピックで大活躍した彼の考え。確かに there are good people in the world who will help you to reach your goal. だなあとか思って感謝なのです。