
Algebra::AlgebraicParser

(文字列の代数的評価クラス)

ファイル名:

 ・ algebraic-parser.rb

スーパークラス:

 ・ Object

インクルードしているモジュール:

なし

クラスメソッド:

Algebra::AlgebraicParser.eval(string, ring)
    string の四則演算式を ring 上で計算します。
   

メソッド:

なし

仕様

評価の手順

変数の値は、その変数名を引数として ring のクラスメソッド indeterminate の引数と
して渡され、その戻り値として評価されます。また数値は ring.ground のクラスメソッ
ド indterminate で評価されます。
require "algebraic-parser"
class A
  def self.indeterminate(str)
    case str
    when "x"; 7
    when "y"; 11
    end
  end
  def A.ground
    Integer
  end
end
p Algebraic::AlgebraicParser.eval("x * y - x^2 + x/8", A)
    #=> 7*11 - 7**2 + 7/8 = 28

ここで、Integer の indeterminate は algebraic-parser.rb が require している
algebra-supplement.rb で次のように定義されています。
def Integer.indeterminate(x)
  eval(x)
end

識別子

識別子は、「英字1文字＋数字0文字以上」で定義されます。したがって
"a13bc04def0"

は、
"a13 * b * c04 * d * e * f0"

と解釈されます。

演算子

演算子を結合の弱い順に並べます。
;       中間評価
+, -    和, 差
+, -    単項 +, 単項 -
*, /    積, 商
並置    積
**, ^   冪

用例

クラス Algebra::Polynomial、クラス Algebra::MPolynomial には適切に
indeterminate, ground が定義されています。したがって次のように文字列評価ができ
ます。
require "algebraic-parser"
require "rational"
require "m-polynomial"
F = Algebra::MPolynomial(Rational)
p Algebra::AlgebraicParser.eval("- (2*y)**3 + x", F) #=> -8y^3 + x

Algebra::MPolynomial では、indeterminate は変数を表現するオブジェクトの登録も行
うので、登録順が変数間の順序になります。したがって ; を使って先に変数を評価させ
る事によって、順序の変更をする事ができます。
F.variables.clear
p Algebra::AlgebraicParser.eval("x; y; - (2*y)**3 + x", F) #=> x - 8y^3
