これまでのまとめ
本日のお品書き
ついに来ました最終回。最後を飾るのはコレしかないでしょう、はい、Windowsバッチファイルです。最後にふさわしい困難がそこにはありました。
FizzBuzz
せっかくなので動作せずにハマったパターンを先に載せます。
@echo off
setlocal
for /l %%x in (1, 1, 100) do (
rem /aをつけないと数値として扱われない. また=の前後にスペースを入れてもいけない.
set /a F=%%x %% 3
set /a B=%%x %% 5
set /a FB=%F%+%B%
if "%FB% == "0" (
echo Fizz Buzz
) else if "%F%" == "0" (
echo Fizz
) else if "%B%" == "0" (
echo Buzz
) else (
echo %%x
)
)
endlocal
これを実行するとエラーです。見事にはまりました。for
の中の環境変数展開が都度行われないという仕様のため、set
が評価される前にif
が呼ばれ、その中で存在しない変数を参照しようとするためエラーになってしまいます。
これを解決するには遅延環境変数展開を有効にするとともに、変数名を% %
ではなく! !
で囲う必要がありました。
@echo off
- setlocal
+ setlocal enabledelayedexpansion
for /l %%x in (1, 1, 100) do (
rem /aをつけないと数値として扱われない. また=の前後にスペースを入れてもいけない.
set /a F=%%x %% 3
set /a B=%%x %% 5
- set /a FB=%F%+%B%
+ set /a FB=!F!+!B!
- if "%FB%" == "0" (
+ if "!FB!" == "0" (
echo FizzBuzz
- ) else if "%F%" == "0" (
+ ) else if "!F!" == "0" (
echo Fizz
- ) else if "%B%" == "0" (
+ ) else if "!B!" == "0" (
echo Buzz
) else (
echo %%x
)
)
endlocal
おわりに
くぅ〜疲れましたw1
- 完走賞を目指してはじめてみたのですが、初めて関数型言語を触るきっかけにもなるなど、意外と学びが多い試みになりました。やってみてよかったです。
- 言語仕様もそうですが、初めて触る言語だと、やはり実行方法自体もなかなかわからなかったりしますね。その辺りが分かりやすかったり、Docが親切だったりする言語は、初学者にとっては触りやすい言語なんじゃないかな?と思いました。