Pull to refresh

Comments 2

Мне, к примеру, понравился цикл в расте с паттерн матчингом: код.
На плюсах вышло как-то так: код.

    match_opcode(opcode
        , []() { assert(false && "Unknown opcode."); }
        , code(0x0, 0x0, 0xE, 0x0, [&]()
        { /*CLS*/
            clear_display(); })
        , code(0x0, 0x0, 0xE, 0xE, [&]()
        { /*RET*/
            assert(sp_ > 0);
            --sp_;
            assert(sp_ < std::size(stack_));
            pc_ = stack_[sp_]; })
        , code(0x0, _n, _n, _n, [](std::uint16_t)
        { /* SYS addr. This instruction is only used on the old computers
            on which Chip-8 was originally implemented.
            It is ignored by modern interpreters. */ })
        , code(0x1, _n, _n, _n, [&](std::uint16_t nnn)
        { /* JP addr. */
            pc_ = nnn; })
        , code(0x2, _n, _n, _n, [&](std::uint16_t nnn)
        { /* CALL addr. */
            assert(sp_ < std::size(stack_));
            stack_[sp_] = pc_;
            ++sp_;
            pc_ = nnn; })
        , code(0x3, _x, _k, _k, [&](std::uint8_t x, std::uint8_t kk)
        { /* SE Vx, byte. */
            pc_ += ((V_[x] == kk) ? 2 : 0); })


Что в плане компактности и «декларативности» мне очень нравится.
Sign up to leave a comment.