hirax.net::inside out::2010年05月13日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2010年4月 を読む << 2010年5月 を読む >> 2010年6月 を読む

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    
  end
 require "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メソッドは利用できません。それが、暗黙に自動で型変換を行わせていない理由です。