// calc.groovy // Version 1.0 // KAKU PROJECT (2014) // 概要:複素数の計算式を処理するスクリプト // 実行例: groovy calc.groovy file // ビルトイン定数とビルトイン関数の定義 def binding = new Binding([ // i: 虚数 i: new Complex(0, 1), // Re: 複素数から実数部を取り出す関数 Re: {z -> z.r}, // Im: 複素数から虚数部を取り出す関数 Im: {z -> z.i}, // conjugate: 複素数の共役複素数を作る関数 conjugate: {z -> def z2 = new Complex(z) new Complex(z2.r, -z2.i)}, // conjugate: 複素数の絶対値を計算する関数 abs: {z -> def z2 = new Complex(z) java.lang.Math.sqrt(z2.r**2 + z2.i**2)} ]) // Number クラスに複素数オブジェクト用の演算を追加する。 // 加算 Number.metaClass.plus = {Complex b -> new Complex (delegate, 0)+b } // 減算 Number.metaClass.minus = {Complex b -> new Complex (delegate, 0)-b } // 乗算 Number.metaClass.multiply = {Complex b -> new Complex (delegate * b.r, delegate * b.i) } // 除算 Number.metaClass.div = {Complex b -> new Complex (delegate, 0)/b } // 入力ファイルの各行の式を加工し、ストリングバッファに保存。 def sb = new StringBuffer() new File(args[0]).eachLine { sb << "println (\"${it}\\n==>\${${it}}\\n\")\n" // println sb } // メモ: // 入力行→xxx // 評価される行→println ("xxx\n==>${xxx}\n") // エスケープした行→"println (\"xxx\\n==>\${xxx}\\n\")\n" // 式の評価。 def shell = new GroovyShell(binding) shell.evaluate( sb.toString() )