10

Task

Exercise 7

動的データ構造を活用した、何か面白いプログラムを作る。

Result

文字を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

Consideration

記述した各演算子ごとに処理を@funにbindさせ、 最後のto_iでまとめて計算するようにしました。 コードを短縮化させるために, lambda関数を用いました。 また, @bind内で@fun.cloneしないで参照の値を渡すと、 stack level too deep (SystemStackError) が発生するので、 現在の関数 @fun を複製してから追加させる必要がありました。

Ref

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