IBM 製の Tcl → Python 変換ツール [Tcl]
偶然に表題の Jacl2Jython [1] というツールを見つけた。これはいままで WAS のスクリプティングに Jacl (Tcl) を使っていたのが廃止されて Jython (Python) を採用することになったのでその移行を支援するためのものらしい。Tcl の不採用がさびしい感じだけどツールとしては面白いので使ってみた。
簡単な以下のようなサンプルが、
set var "Hello"
proc greeting {msg} {
puts $msg
}
greeting $var
for {set i 0} {$i < 10} {incr i} {
if {$i %2 == 0} then {
puts $i
}
}
こう変換される。
#
#####################################################################
## NOTE: This code is PRELIMINARY, it requires MANUAL VERIFICATION ##
## *********** ******************* ##
#####################################################################
#
import sys
def wsadminToList(inStr):
outList=[]
if (len(inStr)>0 and inStr[0]=='[' and inStr[-1]==']'):
tmpList = inStr[1:-1].split() #splits space-separated lists,
else:
tmpList = inStr.split("\n") #splits for Windows or Linux
for item in tmpList:
item = item.rstrip(); #removes any Windows "\r"
if (len(item)>0):
outList.append(item)
return outList
#endDef
var = "Hello"
def greeting ( msg ):
print msg
#endDef
greeting(var )
i = 0 #forStart
while ( i < 10 ): #forTest
if (i % 2 == 0):
print i
#endIf
i += 1 #forNext
#endWhile (#endFor)
「#endDef」とか Python をはじめたばかりの頃についつい書いてしまう感じのコメント行がつくのはご愛嬌。
気になるのは明らかにダイレクトに変換できなさそうな eval とか uplevel とかはどうなるのかということだけど、
set script {puts "hello"}
eval $script
上のようなソースは
script = ["puts", "hello"]
eval ( script )
こうなってしまった。uplevel は単にサポートされていない。
あと他にもこまごまとした点で本来の Tcl の文法より制約が多くなっている。proc の引数が1つの場合は {} で囲まなくてもいいのにそれを要求してくるとか、then はキーワードでもなんでもない(Tcl に他言語でいうキーワードは一切存在しない)のに変数名に使えないとか。
しかし厳密な意味では構文木に変換することもできないし、文字列リテラルとコードブロックの区別も不可能な Tcl のプログラムを普通の他言語に変換するというのは相当にハードルの高い問題だというのは確か。Tcl 処理系自身がやっているバイトコードコンパイルは一体どんな方略を取ってるんだろうか。
[1] http://www-1.ibm.com/support/docview.wss?rs=180&uid=swg24012144
コメント 0