normal ordering
Boost.Spirit の練習がてら、 Mathematica の expand みたいなもの(Mathematicaよく知らんですが、要するに素因数分解の逆)を作ったわけですが。
http://shinh.skr.jp/dat_dir/no.cc
Boost.Spirit は Parsec よりはちょっと書きにくいかなぁという感じですけど、 Haskell はそれ以外の部分ていうか do モナドが苦痛でしょうがないのと、 Haskell とか OCaml の型システムってなんか parser 向きだよね、っていうあたりで、まぁどっちが幸せとも言えないような感じだなぁとか思いました。誰かが D で Spirit 作ってくれたら僕は感動すると思います。
Spirit とか Parsec で一番こう、 DSL たらしめている、というか、一見して驚く部分である、 BNF に近い記法である、っていうのは、なんかオペレータオーバーロードがある、っていうのが一番理由として大きいような。これをもって C++ やら Haskell はスバラシイ、っていうのは、なんかそれでいいんだろうか、とか思うんですよねどうも。
わざわざ再生産した理由は、少し普通と違う動作がさせたくて、演算子だと通常の交換関係が成り立たないので、このあたりなんとかしたいんですね。具体的にはボソンの昇降演算子の、
というのを処理して、全部 で始まるようにしてくれると嬉しいのです。
i@u ~/res/no> ./a.out (ca-sA+z)(cA-sa+z) (ca-sA+z)(cA-sa+z) => +cc+ccAa-csaa+cza-csAA+ssAa-szA+czA-sza+zz <0|(ca-sA+z)(cA-sa+z)|0> => +cc+zz <A|(ca-sA+z)(cA-sa+z)|A> => +cc+cczz-2cszz+2czz+sszz-2szz+zz (ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z) (ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z) => +cccc+3ccccAa-4cccsaa+3cccza-4cccsAA+8ccssAa-5ccszA+3ccczA-5ccsza+3cczz+ccccAAaa-2cccsAaaa+2ccczAaa-2cccsAAAa+4ccssAAaa-4ccszAAa+2ccczAAa-4ccszAaa+4cczzAa+ccssaaaa-2ccszaaa+2ccss-2csssaa+3cssza-2csssAaaa+4csszAaa+2csszaaa-4cszzaa+cczzaa-2cszz-4cszzAa+2czzza+ccssAAAA-2csssAAAa+2csszAAA-2ccszAAA+4csszAAa-4cszzAA-2csssAA+ssssAa-ssszA+ssssAAaa-2ssszAAa+3csszA-2ssszAaa+4sszzAa+sszzAA-2szzzA+cczzAA+2czzzA-sssza+sszz+sszzaa-2szzza+zzzz <0|(ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z)|0> => +cccc+3cczz+2ccss-2cszz+sszz+zzzz <A|(ca-sA+z)(cA-sa+z)(ca-sA+z)(cA-sa+z)|A> => +cccc+3cccczz-8cccszz+6ccczz+8ccsszz-10ccszz+3cczz+cccczzzz-4cccszzzz+4ccczzzz+6ccsszzzz-12ccszzzz+6cczzzz+2ccss-4cssszz+6csszz-4cssszzzz+12csszzzz-12cszzzz-2cszz+4czzzz+sssszz-2ssszz+sssszzzz-4ssszzzz+6sszzzz-4szzzz+sszz+zzzz
わあいクソめんどくさい squeezed state の光子数分散が簡単に求められるぞー。と言ってもたぶん私以外誰も嬉しくない。一応、 A が です。 aAbB が昇降演算子、 z は <α|Aa|α> = z^2 ということにしてます。つまりα。