2010-05-13[n年前へ]
■続 オブジェクト指向のRubyに、数式処理ソフトウェアMathematicaの機能を自然な形で取り入れてみよう!?
「オブジェクト指向のRubyに、数式処理ソフトウェアMathematicaの機能を自然な形で取り入れてみよう!?」で書いたコードに、Mathematicaの「リスト」をRubyの配列に変換するメソッドTo_aを追加しておきました。たとえば、
pp ('i'.Table '{i,1,3}').To_a.join('-')というようなコードを書くと、
"1-2-3"という結果が出力されます。'i'.Table '{i,1,3}'という部分はMathematicaのコードで、Table[i,{i,1,3}]に相当します。その結果をTo_aで、RubyのArrayに変換した上で、RubyのArrayのメソッドjoinで要素を結合している、という具合です。(To_aを明示的に書かずに、暗黙的に変換を行ってしまっても良いのですが、今は明示的にTo_aを書くようにしています)
MathematicaのリストからRubyの配列に変換する部分は、下のようなコードになっています(全体像は先日の記事を参照ください)。
def Mathematica.to_a str require "JSONParser" jsonParser=JSONParser.new s=str.gsub(/, ([^{]{1})/,',"\1') s=s.gsub(/([^}]{1}),/,'\1",') s.gsub!(/\{([^{]{1})/,'["\1') s.gsub!(/([^}]{1})\}/,'\1"]') jsonParser.parse s endrequire "JSONParser" という記述があることでわかるように、Mathematicaのリスト(を文字列にしたもの)がJSON(JavaScript Object Notation)の配列と同じ構造になっていることから、JSONをIronRubyで使うライブラリ、JSONParserを利用して「Mathematicaリスト→Ruby配列」の変換を行っています(なお、このJSONParserを使うには、require 'strscan'の追加、および、IronRubyのbinディレクトリ内にあるMicrosoft.Scripting.dllを使うことができるようにパスを追加する必要がありました)。
こんなことをしてみると、MathematicaとRubyを繋ぐために、JavaScriptで使うJSONを利用してみたりすると…何だか言語間が繋がってくるような気がして、何だか少し楽しいですね。
なお、今回使用したJSONParserが文字列内にカッコ([])があるときに、JSON配列のパースを行えないため、今回のコードでは、Mathematicaの出力結果リスト中に[]があるときには、たとえばSin[x]といったものがある場合には、このTo_aメソッドは利用できません。それが、暗黙に自動で型変換を行わせていない理由です。