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 の課題とかこのくらいで良かったんじゃないかなぁと、ふと。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h