動的データ構造を活用した、何か面白いプログラムを作る。
文字をSymbolicにそのまま演算するコードを作成しました。
作成したclass Symはレポート巻末に綴じました。
結果は以下のようになりました。
また、 Webでベンチマークできるようにしました。
x, y, z = (0..2).map do Sym.new end
x == 3
y == 4
z == x ** 2 + y ** 2
p z.to_i # -> 25
記述した各演算子ごとに処理を@funにbindさせ、
最後のto_iでまとめて計算するようにしました。
コードを短縮化させるために, lambda関数を用いました。
また, @bind内で@fun.cloneしないで参照の値を渡すと、
stack level too deep (SystemStackError) が発生するので、
現在の関数 @fun を複製してから追加させる必要がありました。
class Sym
def initialize(initValue=nil)
@_ = initValue
@fun = ->{@_}
@bind = ->fun{_ = @fun.clone; @fun = ->{@_ = _[]; fun[]}; self}
end
def to_i() @fun[] end
def +(_) @bind[->{@_ + _.to_i}] end
def -(_) @bind[->{@_ - _.to_i}] end
def *(_) @bind[->{@_ * _.to_i}] end
def /(_) @bind[->{@_ / _.to_i}] end
def **(_) @bind[->{@_ ** _.to_i}] end
def ==(_) @bind[->{_.to_i}] end
end