2011年12月10日土曜日

なんと Nimrod で Python が使えるの!?

全国の Nimrod ファンのみなさんこんにちは。
Nimrod Advent Calendar の 10日目を担当している、@takano32 a.k.a. TAKANO Mitsuhiro です。

今回はexamplesにふくまれているpythonex.nimについてお話します。
Nimrod/examplesにはさまざまなサンプルプログラムが収録されています。fizzbuzz.nimなどの基本的なものからkeyval.nimのような正規表現の利用例などがあります。
おやおや、なにか気になる名前のサンプルがあります。"pythonex.nim" とあります。これはいったいなにをするプログラムなのでしょう。
# Example to embed Python into your application
import python
# IMPORTANT: Python on Windows does not like CR characters, so
# we use only \L here.
Py_Initialize()
discard PyRun_SimpleString("from time import time,ctime\L" &
"print 'Today is',ctime(time())\L")
Py_Finalize()
view raw pythonex.nim hosted with ❤ by GitHub

おお、どうやらPythonの処理系をプログラムに組み込み実行するサンプルのようです。ほんとに実用的なのかな?と思って以下のような意地悪をしてみました。

# Example to embed Python into your application
import python
# IMPORTANT: Python on Windows does not like CR characters, so
# we use only \L here.
Py_Initialize()
# http://www.nishiohirokazu.org/blog/2007/08/post_323.html
discard PyRun_SimpleString("""
(lambda s=__import__("sys"),(y,m)=input("year and month (y, m)>"):(lambda w=s.stdout.write,l=[28 +v for v in 3,(lambda y,x=lambda y,d:y/d-(y-1)/d:x(y,4)-x(y,100) +x(y,400))(y),3,2,3,2,3,3,2,3,2, 3][m-1],z=lambda y,m,d:(lambda a ,b:(int(m*2.6-0.2)+d+b+b/4+a/4+5 *a)%7)(*divmod(y,100)):w(("%d/%" "d"%(y,m)).center(20)+"\n")or w( " S M Tu W Th F S \n")or[[1- (0<e<=l)and[w(" "*3)]or w("%2d \ "%e)for e in range(d,d+7)]and w( "\n")for d in range(1-(lambda y, m,d:(m<3)and[z(y-1,m+10,d)]or[z( y,m-2,d)])(y,m,1)[0],l,7)])())()
""")
Py_Finalize()
view raw gistfile1.nim hosted with ❤ by GitHub

おお、わりと複雑なパースが必要なはずなのに動いています!すごいですね。これはRubyistとしてはrubyex.nimを作成する使命を感じます。おっと、次回予告か死亡フラグとなってしまいそうです。今回はこれまでとさせてください。

11日目の記事はsyanbi a.k.a. @xga さんの記事になります。お楽しみに!

1 件のコメント: