clojureについて文法・言語形態の範囲を超えて、javaの生態系にのっかっていることを考えていた。そのときにそういえばjythonというjavaで動くpythonという実装を思い出した。
前にちょっとさわろうとしたのだけども、あのときにはjavaの中からpythonスクリプトが呼び出せる、というところだけに目がいってpythonから既存javaクラスを呼ぶという発想にたどり着いていなかった。理解していなかった。HPの冒頭すぐにあるHere is an example of running Python code inside a simple Java applicationに意識が集中して、その下のHere is an example of using Java from Python codeの部分の潜在力を理解していなかったということ。
今時点のjythonは、個人的感想としてさみしいというか、2.7系のpythonとしてあまり追い風が吹く状況でなく、いわゆるリリースもほとんどなされてない感じです。それでもつい最近にJython 2.7.2 beta (v2.7.2b3 February 2020)動きはあったみたいです。
改めて、`pythonからjavaを呼び出す使い方`で一例試してみる。
nao@ $java -jar jython-standalone-2.7.2b3.jar Jython 2.7.2b3 (v2.7.2b3:6d3659465010, Feb 2 2020, 11:27:28) [Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_151 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path.append('/opt/voltdb/voltdb/voltdbclient-7.8.1.jar') >>> import org.voltdb.client.ClientConfig >>> import org.voltdb.client.ClientFactory >>> config = org.voltdb.client.ClientConfig() >>> client = org.voltdb.client.ClientFactory.createClient(config) >>> client.createConnection("voltdb1") >>> res = client.callProcedure("@Statistics", [ "latency", 1]) >>> res.getResults() array(org.voltdb.VoltTable, [ header size: 138 status code: -128 column count: 13 cols (TIMESTAMP:BIGINT), (HOST_ID:INTEGER), (HOSTNAME:STRING), (INTERVAL:INTEGER), (COUNT:INTEGER), (TPS:INTEGER), (P50:BIGINT), (P95:BIGINT), (P99:BIGINT), (P99.9:BIGINT), (P99.99:BIGINT), (P99.999:BIGINT), (MAX:BIGINT), rows - 1582871858636,2,voltdb3,5000,41387,8277,524,14455,36767,50559,55199,55967,55967 1582871858408,0,voltdb1,5000,46374,9274,547,11191,29823,45855,54687,58719,58719 1582871858616,1,voltdb2,5000,38453,7690,531,10527,32479,58303,70271,70463,70463 ]) >>>
sys.pathに使うjarを明示的に足すことでそのjarに含まれるclassのimportが可能になるとのこと。例外発生時とかコールバックを試してみてないけども、java.util.XXXとか全然importできてしまう*1
jarに入っているclass のメソッドのテストとかが簡単にできそう。なにをテストしてるかの読みやすさな点ではclojureよりいい。テストデータの生成・加工するという点でもいいか。
そういえば、IronPythonというものも思い出した。これについてはパワフルだと感じていた。ほとんど使うケースが起きえなかったのだけども .netがimportできるという部分には、畏敬の念(大げさ)を感じたような記憶あります。*2思い返すと、異なる言語をつないでいる構造が同じで、近視眼的かもしれないけどもようするに言語(フレームワーク?)のいいとこどり、の構造だったということ。
ていうか、作られた方は同じみたい。respect him.