0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

多言語FizzBuzzチャレンジ25日目:Windowsバッチファイル

Last updated at Posted at 2022-12-24

これまでのまとめ

本日のお品書き

ついに来ました最終回。最後を飾るのはコレしかないでしょう、はい、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が親切だったりする言語は、初学者にとっては触りやすい言語なんじゃないかな?と思いました。
  1. くぅ〜疲れましたwとは. https://dic.nicovideo.jp/a/%E3%81%8F%E3%81%85%E3%80%9C%E7%96%B2%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9Fw

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?