GoToキャンペーンを自粛してプログラミング言語のgoto文でやってみる

2020年7月22日からGoToキャンペーンが開催されました。
コロナ感染者がどんどん増えているっていうのにね。

僕はどこにも出かける予定が無いのでGoToキャンペーンなんか関係ないけれど
GoTo…話題ですもんね 乗るしかない このビッグウェーブに!

でも自粛しなきゃね。
ということで、プログラミング言語のgoto文でGoToしてみようじゃあないか。
無限ループ(禍)から脱出だ!

goto文とは…

プログラミング言語におけるgoto文(ゴートゥぶん、英: goto statement)とは、手続き列中の指定された場所(専らラベルで指定される)に無条件にジャンプ(移動)する、という制御構造のひとつである
goto文 – Wikipedia

最近のプログラミング言語ではgoto文が使えるものは少ない。
流れが分かりづらくなるから多用しちゃダメ。というか、ほぼ使ったことが無い。

goto文が使えるgoto文の花嫁達

  • ・BASIC
  • ・FORTRAN
  • ・C
  • ・C#
  • ・PHP5.3以降
  • ・Go
  • ・番外編 Python

他にもまだ出会っていない花嫁がいると思うが、とりあえず思いついたものだけ。

Dockerで環境が作れるものをいくつか試してみました。

C

gotoといえばC言語!おなじみC言語だ。全然なじみ無いんですけどね。

#include <stdio.h>

int main()
{
    int i = 1;
    while(1)
    {
        if (i > 100) {
            goto TROUBLE;
        }
        i += 1;
    }

TROUBLE:
    puts("GoToキャンペーン");
    return 0;
}
cc -o main main.c
./main
GoToキャンペーン

出ました!GoToキャンペーン!

C#

C言語の後継C#も、もちろんgotoできますね。

using System;


class GoTo
{
    static void Main()
    {
        int i=1;
        while (true) {
            if (i > 100) {
                goto Trouble;
            }
            i++;
        }

        Trouble:
            Console.WriteLine("GoToキャンペーン");
    }
}
dotnet run
GoToキャンペーン

はい、出ました!GoToキャンペーン!

PHP

PHPはPHP5.3からgotoが使えるようになっています。

<?php

$i = 1;
while(true) {
    if ($i > 100) {
        goto Trouble;
    }
    $i++;
}

Trouble:
    echo "GoToキャンペーン\n";
php index.php
GoToキャンペーン

またまたGoToキャンペーンしてやったぜ!

Go

お気に入りのGo言語。
色んな構文を削ぎ落としたはずなのに何故かgotoができる謎。GoogleのGoだもんね、しょーがないよね。

package main

import "fmt"

func main() {
    var i int = 1
    for {
        if i > 100 {
            goto トラブル
        }
        i++
    }
    トラブル:
    fmt.Println("GoToキャンペーン")
}
go run main.go 
GoToキャンペーン

もうおなかいっぱい GoToキャンペーン。

番外編 Python

Pythonでもgotoが存在はしているが、2004年エイプリルフールのジョークモジュールだそうで、実運用には使っちゃダメよって。

The “goto” module was an April Fool’s joke, published on 1st April 2004. Yes, it works, but it’s a joke nevertheless. Please don’t use it in real code!
entrian.com – goto for Python – Download

from goto import goto, label


def main():
    i = 1
    while(True):
        if i > 100:
            goto .trouble
        i += 1

    label .trouble
    print("GoToキャンペーン")


if __name__ == "__main__":
    main()

このコードでできるとは思うけど、gotoモジュールがエラーで実行できませんでしたヽ(´ー`)ノ
Python3.8.5だからか?Python2.7.17でも試したけどだめだった。
直して実行する気もないのでこれで終わりとします。

色んな言語のgoto文で色んなところに出かけた気分になりました。なったんです。。
十分にマイGoToキャンペーンを堪能したので連休はしっかり自粛しよう。