窓使いの憂鬱プログラミング Part 2

いかんともしがたい理由によりUN*X Wizardが窓使いにジョブチェンジする時、その操作体系の違いにより憂鬱な日々を送っている人*1に、窓使いの憂鬱の使い方を聞かれたことを思い出しました。
ええと、窓使いの憂鬱とは、物理キーボードに対する操作を入力、アプリケーションに送る文字列を出力とする、パターンマッチング駆動でチューリング不完全な言語のインタプリタです。
たとえばメモ帳上で、EnterをHello World!に挿げ替えるには次のようにします。

window Notpad /Notepad:Edit$/

key enter = s-H e l l o comma w o r l d s-_1

実験をするときはwindowを限定しとかないと、.mayuを編集している方のエディタでも動作してしまってえらいことになります。
とにかくこうして、キーボード入力を置き換えていくわけです。キーに付けられた名前は109.mayuあたりを見ると書いてあります。
たとえばechoであれば次のようになります。

キーボード入力をそのままアプリケーションに送るのはデフォルト動作ですので、0バイトecho達成です。AWKsedに勝ちましたよ……というのは嘘で、0バイトの.mayuを喰わせようとするとエラーになりますので、空白か改行か#かなんか必要ですので1バイト引き分けになります。
duplicate linesなんかも簡単に書けます。

window Notpad /Notepad:Edit$/

key enter = home s-end c-c end enter c-v enter

ただしこのやり方はクリップボードを破壊します。
窓使いの憂鬱の内部レジスタはフラグ10ビットとカウンタ1個しか無いため、クリップボードの中身で分岐を行えたら夢が広がるのですが……とリファレンスを見ていたら、ありましたよ。&EmacsEditKillLineという名前のfunctionを使えば、クリップボードが空かそうでないかで分岐できます。
これでdelete blank linesも書けるようになりました。

window Notpad /Notepad:Edit$/

key enter = &EmacsEditKillLineFunc home s-end c-c end enter &Sync &EmacsEditKillLinePred((backspace), (&Ignore))

空白行での改行を無効にします。
窓使いの憂鬱の動作そのものが入力に対するパターンマッチング駆動ですので、入力を置き換えていく系は複雑な条件判断が絡まない限り問題ないと言えるでしょう。
たぶんlook-and-say sequenceあたりもできます。表示された変換後の数列を再度人間が入力する条件なら、ですが。
問題なのが計算です。
&Variableはありますが、&Variableは&Repeatでしか使えないためあまり意味がありません。&Variableの値を文字コードとみなしてアプリに送るfunctionがあれば良かったのですが……ですので99 shinichiroes of hamajiは挫折しました。Excelの上で実行していいならなんとでもなりますがー。
というわけで基本は10ビットのフラグレジスタで頑張ることになります。
フラグレジスタを用いた計算例などは以下を参照ください。
http://d.hatena.ne.jp/ytqwerty/20060408#p1
http://jisx6004.blog8.fc2.com/blog-entry-64.html
どうしても大きい数の計算が必要な場合は&ShellExecute("open", "calc.exe",,, ShowNormal)などもアリです。
一方状態の管理については、スタックは1段しか無いですが、goto(&Keymap)もchain(&LoadSetting)もできますので、.mayuが膨大なサイズになることを厭わなければ割と何でもできます。
さあ、Let's 窓使いの憂鬱プログラミング!

*1:要するにノートPCがWindowscoLinuxを使われてるshinichiro.h先生なんですがm(__)m