Rokiのチラ裏

学生による学習のログ

brainf**k インタプリタジェネレータ

何だか凄く早い時間に起きてしまい、特にやることもないのと、最近アニメのセリフをbrainfuckの命令語に置き換える遊びが再発しているので、ジェネレータというかライブラリとも言えぬ小さいヘッダを書く事にした。

こう使う。一応元ネタさんと同じ命令語で動くようにしてある。

// kemono.cpp
#include<srook/brainfk/brainfk.hpp>

template<class... T>
constexpr auto make_array(T&&... ts) -> std::array<std::decay_t<srook::First_t<T...>>,sizeof...(ts)>
{
    return std::array<srook::First_t<T...>,sizeof...(ts)>{{std::forward<T>(ts)...}};
}

int main(const int argc,const char* argv[])
{
    using namespace std::string_literals;
    if(argc<2)return -1;

    const auto gengo_friends_tanoshi=
        make_array(
                std::wstring(L"たのしー!"),std::wstring(L"すごーい!"),std::wstring(L"たーのしー!"),
                std::wstring(L"すっごーい!"),std::wstring(L"なにこれなにこれ!"),std::wstring(L"おもしろーい!"),
                std::wstring(L"うわー!"),std::wstring(L"わーい!")
        );
    srook::brainfk_syntax<std::wstring,unsigned char> bksy(gengo_friends_tanoshi);

    const auto& status=bksy.file_open(argv[1]);
    if(status==boost::none)return -1;

    bksy.analyze();
    bksy.exec();
}

因みに世界に挨拶を捧げるプログラミング言語フレンズKemonoのコードはこちら。

たのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!うわー!すごーい!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たのしー!すっごーい!わーい!すごーい!なにこれなにこれ!たのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!うわー!すごーい!たーのしー!たーのしー!たーのしー!たーのしー!たのしー!すっごーい!わーい!すごーい!たーのしー!なにこれなにこれ!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!なにこれなにこれ!なにこれなにこれ!たーのしー!たーのしー!たーのしー!なにこれなにこれ!うわー!すっごーい!わーい!たのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!うわー!すごーい!たーのしー!たーのしー!たーのしー!たーのしー!たのしー!すっごーい!わーい!すごーい!なにこれなにこれ!たのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!うわー!すごーい!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たのしー!すっごーい!わーい!すごーい!なにこれなにこれ!たのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!うわー!すごーい!たーのしー!たーのしー!たーのしー!たのしー!すっごーい!わーい!すごーい!なにこれなにこれ!たーのしー!たーのしー!たーのしー!なにこれなにこれ!すっごーい!すっごーい!すっごーい!すっごーい!すっごーい!すっごーい!なにこれなにこれ!すっごーい!すっごーい!すっごーい!すっごーい!すっごーい!すっごーい!すっごーい!すっごーい!なにこれなにこれ!うわー!すっごーい!わーい!たのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!うわー!すごーい!たーのしー!たーのしー!たーのしー!たーのしー!たのしー!すっごーい!わーい!すごーい!たーのしー!なにこれなにこれ!うわー!すっごーい!わーい!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!なにこれなにこれ!

普通に以下のように実行。

$ clang++ -std=c++1z -Wall -Wextra -pedantic kemono.cpp
$ ./a.out hello_world.kemono

私は最近ポンコツエストというアニメが少し面白いと思っているので、その作中で出てくる言葉を命令語にしたく思う。

#include<srook/brainfk/brainfk.hpp>

//...

const auto ponkue=
    make_array(
            std::wstring(L"ブラック企業かよ"),std::wstring(L"アイスうめー"),std::wstring(L"ヒョウド!"),
            std::wstring(L"ドルファヘキセンダー"),std::wstring(L"おもらひ"),std::wstring(L"おねひ"),
            std::wstring(L"労災はおりない"),std::wstring(L"ハンマー")
    );
srook::brainfk_syntax<std::wstring,unsigned char> bksy(ponkue);

const auto& status=bksy.file_open(argv[1]);
if(status==boost::none)return -1;

bksy.analyze();
bksy.exec();

まあ、置き換えているだけである。この場合、世界に挨拶するためには以下のようなコードとなる。

ブラック企業かよヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!労災はおりないアイスうめーヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ブラック企業かよドルファヘキセンダーハンマーアイスうめーおもらひブラック企業かよヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!労災はおりないアイスうめーヒョウド!ヒョウド!ヒョウド!ヒョウド!ブラック企業かよドルファヘキセンダーハンマーアイスうめーヒョウド!おもらひヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!おもらひおもらひヒョウド!ヒョウド!ヒョウド!おもらひ労災はおりないドルファヘキセンダーハンマーブラック企業かよヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!労災はおりないアイスうめーヒョウド!ヒョウド!ヒョウド!ヒョウド!ブラック企業かよドルファヘキセンダーハンマーアイスうめーおもらひブラック企業かよヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!労災はおりないアイスうめーヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ブラック企業かよドルファヘキセンダーハンマーアイスうめーおもらひブラック企業かよヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!労災はおりないアイスうめーヒョウド!ヒョウド!ヒョウド!ブラック企業かよドルファヘキセンダーハンマーアイスうめーおもらひヒョウド!ヒョウド!ヒョウド!おもらひドルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダーおもらひドルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダードルファヘキセンダーおもらひ労災はおりないドルファヘキセンダーハンマーブラック企業かよヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!労災はおりないアイスうめーヒョウド!ヒョウド!ヒョウド!ヒョウド!ブラック企業かよドルファヘキセンダーハンマーアイスうめーヒョウド!おもらひ労災はおりないドルファヘキセンダーハンマーヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!ヒョウド!おもらひ
./a.out hello_world.ponkue
Hello World!

※追記

上記のコードでもそのままコンパイルが通るが、Boost.parameter を使うヘルパーを噛ませておいたので、以下のように何のキーワードを何に設定するのかより明確に書ける。

あと見た目にインパクトがあるので、これらそれぞれの fizzbuzz のコード(?) を載せておく。