2007-06-21(木)
S式計算式
ちょっとさきの勉強会のネタ。本番は、OCamlで作ったのを持っていくつもりだけれども、とりあえずRubyでも作ってみる。
> 1 1 > (+ 1 2) 3 > (* (+ 2 3) 1 3) 15
require 'strscan' require 'readline' def call(name) lambda{|x,*args| x.send name,*args } end module SExpression class Call def initialize(op,*args) @op = op @args = args end def eval @args.map(&call(:eval)).inject(&call(@op)) end end class Number attr_reader :num alias_method :eval,:num def initialize(num) @num = num end end def self.parse(str) str = StringScanner.new(str) if str.class == String str.skip /\s+/ if str.skip /\(/ then op = str.scan %r![-+*/]! args = [] args << parse(str) until str.skip /\)/ Call.new op.to_sym,*args elsif str.scan /\d+/ then Number.new str.matched.to_i else raise 'error' end end end while buf = Readline.readline('> ',true) puts SExpression.parse(buf).eval end
- callは、ちょっと自慢
- ちゃんとASTも作ってみた
- 3秒あまった。あまったとは言わんけど
コメントを書く
トラックバック - http://d.hatena.ne.jp/mzp/20070621/sexp
リンク元
- 10 http://d.hatena.ne.jp/keyworddiary/OCaml
- 8 http://d.hatena.ne.jp/keyworddiary/Ruby
- 6 http://mzp.sakura.ne.jp/wiki/
- 4 http://d.hatena.ne.jp/keyworddiary/Haskell
- 4 http://www.google.co.jp/search?q=自分自身に出力+unix&ie=UTF-8&hl=ja&lr=lang_ja
- 3 http://reader.livedoor.com/reader/
- 3 http://translate.google.com/translate_p?hl=en&sl=ja&u=http://d.hatena.ne.jp/mzp/20070621&prev=/search?q=stringscanner+ruby+s-expression&hl=en&safe=off&client=safari&rls=en&sa=G
- 2 http://blog.8-p.info/articles/2007/06/17/creammonkey-0-9
- 2 http://d.hatena.ne.jp/Meguu/20070621/1182434555
- 2 http://d.hatena.ne.jp/keyword/OCaml

