このページでは、Deadfishをもとにして新たな言語を作ります。
Deadfish(直訳:死んだ魚)は、難解プログラミング言語のひとつで、もともとHQ9+のサブセットとする予定だったそうです参考文献4を参照。。
命令は4つですが、HQ9+のような命令はありません。
たったこれだけ！HQ9+よりも一層作りやすいです。
また、XKCDバリエーションという命令の種類もあります。それはインクリメントがx、2乗がkになっています。
仕様は以下のようにします。
数値の型はint型とする。
命令以外の文字はそのまま出力。
これ以外はDeadfishの仕様に従う。
命令を決めましょう。
数値カウンタを作ります。
int counter = 0;
もちろんBrainfuckから流用します。
ここで一番大事なのはg命令でInt32.TryParseを使っているところです。仕様を決めるときにそうしたので、Convert.ToInt32TryParseと同じように文字列を数値に変換するが、細かい部分がいくつか異なっています。例えば、変換に失敗したら例外を投げることなどです。などを使うのはダメです。
また、TryParseの2つ目の引数が「out x」となっていますが、関数側が「この変数への変更を反映したいです～」と設定するときにoutをつける必要があるためです。
ふつう関数の中で引数がいじられても元の変数には影響しません。でも、outをつけておくと変更が反映されるのです。似たようなものにrefキーワードがあります。
switch (cmd[i])
{
    case 'i':
        counter++;
        break;
    case 'd':
        counter--;
        break;
    case 'x':
        counter *= 2;   // counter = counter * 2; と同等
        break;
    case 'z':
        counter = 0;
        break;
    case 'g':
        string s = Console.ReadLine();
        int x = 0;
        if (Int32.TryParse(s, out x))
        {
            counter = x;
        }
        else
        {
            counter = 0;
        }
        break;
    case 'o':
        Console.WriteLine(counter);
        break;
}
何故GOかと言いますと、プログラムがgoだからですこういうプログラムはcatプログラムとか呼ばれたりします。よく使われるのでいろんな種類があります。。数字を入力したら、そのままおうむ返しされます。
コード:go
入力例:
44
出力例:
44
using System;
namespace not_Deadfish
{
    class Program
    {
        static void Main()
        {
            while (true)
            {
                int counter = 0;
                Console.Write("> ");
                string cmd = Console.ReadLine();
                for (int i = 0; i < cmd.Length; i++)
                {
                    switch (cmd[i])
                    {
                        case 'i':
                            counter++;
                            break;
                        case 'd':
                            counter--;
                            break;
                        case 'x':
                            counter *= 2;   // counter = counter * 2; と同等
                            break;
                        case 'z':
                            counter = 0;
                            break;
                        case 'g':
                            string s = Console.ReadLine();
                            int x = 0;
                            if (Int32.TryParse(s, out x))
                            {
                                counter = x;
                            }
                            else
                            {
                                counter = 0;
                            }
                            break;
                        case 'o':
                            Console.WriteLine(counter);
                            break;
                    }
                }
                Console.WriteLine();
            }
        }
    }
}
前は「難解プログラミング言語の作り方/HQ9+をもとにする」です。
次は「難解プログラミング言語の作り方/ちょっとコーヒーブレイク(1) Esolang wikiに投稿してみよう」です。