時代遅れひとりFizzBuzz祭り、今回はバッチファイル。前回のシェルスクリプトとの繋がりは、言うまでもないだろう。暫くUnixっぽさが強かったので、今度はWindowsだ。
仕事でWindowsを使っている関係でバッチファイルはよく書くけど、正直好きではない。もう何というかデフォルトでbash/zshとCoreutilsを入れて欲しい。PowerShellの登場で状況は変わる気がするけど、本格的に普及するのはWindows 7がXPを駆逐してからになるはずだ*1。物好きでもない限り、デフォルトでインストールされていないPowerShellを入れようとは思わないだろう。
まあそれでも、バッチファイルは過去との互換性を維持しつつも色々と拡張されてきたらしいので、昔に比べればまだマシだと思いたい。むなしいけど。
今回FizzBuzzを書くにあたり、正直本当に実現できるのか半信半疑だったのだが、書けてしまった。取り敢えずWindows XP SP3上で動くことは確認済み。
@echo off setlocal enabledelayedexpansion for /l %%I in (1, 1, 100) do ( set MSG= set /a R=%%I %% 3 if !R! == 0 ( set MSG=Fizz ) set /a R=%%I %% 5 if !R! == 0 ( set MSG=!MSG!Buzz ) if "!MSG!" == "" ( echo %%I ) else ( echo !MSG! ) ) endlocal
これを書くだけで精根使い果たしてしまった。バッチファイルのプログラマブルなツールとしての側面に期待するのは止めておいた方がよいと思う。
ちなみにこのバッチファイル、id:eel3:20100531:1275307408 で書いたシェルスクリプト版FizzBuzzよりも遥かに高速だ*2。喜んでよいものやら、複雑な気分だ。
*1:駆逐するか否かは別として……Windows 7からPowerShellがデフォルトで入っているので、Windows 7が普及すればPowerShellを使用する機会も増えるだろう。