forth.rb
http://haskell.g.hatena.ne.jp/mr_konn/20060919/1158656918
Haskell 製の FORTH に非常に大人気ない対抗をしてみました。
@v={ '+'=>proc{@s<<@s.pop+@s.pop}, '-'=>proc{@s<<-@s.pop+@s.pop}, '*'=>proc{@s<<@s.pop*@s.pop}, '/'=>proc{d=@s.pop;@s<<@s.pop/d}, '.'=>proc{p @s}, '@'=>proc{raise if !n=@v[@s.pop];@s<<n}, '!'=>proc{raise if !@v[k=@s.pop];@v[k]=@s.pop}, 'drop'=>proc{@s.pop}, 'swap'=>proc{@s[-2,2]=[@s[-1],@s[-2]]}, 'dup'=>proc{@s<<@s[0]}, } @s=[] w=ARGF.read.gsub(/\([^)]*\)/,'').split i=0 while i<w.size case t=w[i] when 'VARIABLE' @v[w[i+=1]]='' when /^"/ m=t m+=" #{w[i+=1]}" until w[i]=~/"$/ @s<<m.gsub(/"/,'') when /\d+/ @s<<t.to_i when ':' n=w[i+=1] a=[] a<<w[i] until w[i+=1]==';' @v[n]=a else raise t.to_s if !n=@v[t=t] c=n.class if c==Array w.insert(i+1,*n) elsif c==Proc n.call else @s<<t end end i+=1 end
たったこれだけ!そのハスなんとかという言語に比べてずいぶん短いですね!
ウソです怒らないで下さいハスなんとか言語の人。エラーチェックとかしてませんし色々あれですねそうですね。
FIFTH の方のサンプルに入ってるコードは一箇所をのぞいて動きます。一箇所というのは文字列の "2" を数値の 2 として扱うのはキモいなーと思ったのでした。
いや、 FORTH とか結構面白いと思うので引き続き頑張って下さいませ。 LL Ring の課題とかこのくらいで良かったんじゃないかなぁと、ふと。