Alloy関連ツールを2つ公開しました

おっと明後日はスタートAlloy : ATNDじゃないですか。と気づいたので慌てて自分のAlloy勉強用リポジトリの、ローカルの未pushの変更をpushしたり、スクリプトをキレイにしたりしていました。

https://github.com/nishio/learning_alloy

今回公開したのは2つ

allopy

以前show.pyって名前で特に説明もなしにリポジトリにおいていた、AlloyからExportされたXMLをサクサク対話的に加工できるツール。*1 Alloy自体のEvaluatorとかコピペ出来ないし面倒臭いじゃん?Alloyの側をいじって改善しようかと思ったけども、結果はXMLで出力できるんだから、別にそれをいじるのをAlloyでやる必要はないよね、Pythonの対話的インタプリタでやろう、という発想。以前公開していたものとの差分は、対話的な操作方法をメソッド冒頭のコメントに書いて、doctestを使ってそのままテストにした、ってところ。なのでコメントを読めば使い方わかるはず。コメントが間違ってないことはテストで確認済み。

https://github.com/nishio/learning_alloy/blob/master/allopy/allopy.py

一番ハイライトなところだけ載せとく

>>> load_global("test_target.xml")

>>> show_label()
sig:
  Int
  String
  seq/Int
  this/Person
  univ
field:
  love
skolem:
  $x

>>> get("Person")
UtilList([[u'Person$0'], [u'Person$1'], [u'Person$2']])

>>> get("love")
UtilList([[u'Person$0', u'Person$2'], [u'Person$1', u'Person$1'], [u'Person$2', u'Person$2']])

>>> get("$x")
UtilList([[u'Person$2']])

>>> get("Person$0").join(get("love"))
UtilList([[u'Person$2']])

>>> get("love").join(get("$x"))
UtilList([[u'Person$0'], [u'Person$2']])

コンソールでXML出力するツール

これは以前Alloyのコードを読んで「コンソールで使うためのサンプルが入っているじゃん!」と言っていたやつ。*2 自分が使いやすいようにいじったのを公開してなかった。いい名前が思いついてないのでNishioToolとかいうひどい名前になってますが、ようするに「人間がボタンを押さなきゃ次の解が出ないってめんどくさ、CPU余ってるんだから僕が1つ目の解を眺めている間にバックグラウンドでどんどん解を出せよ」というわけで、コマンドラインでNishioTool.sh foo.alsとかやると、解が連番のXMLでどんどん出力されるってものです。

これでようやくEmacsで書いてコンソールで実行するっていう普通の生活が出来るようになった!

本当は画像化したりとかも全部コンソールでやりたいんですけど、まだそのへんは未着手です。

追記

今唐突に思いついたけど、Alloyコード→解のXMLを自動化するツールができてて、解のXMLPythonでいじるツールができてるんだから、次に必要になるのはPythonからAlloyのコードを手軽に生成するためのツールじゃないかな。

名前はPyalloy(ピャロイ)だな。