/** @file VsmInstr.hpp
 *
 *  @author Roland Conybeare, Jan 2026
 **/

#pragma once

#include "VsmOpcode.hpp"

namespace xo {
    namespace scm {
        class VsmInstr {
        public:
            explicit VsmInstr(vsm_opcode oc) : opcode_{oc} {}

            static VsmInstr c_halt;
            static VsmInstr c_eval;

            static VsmInstr c_apply;
            static VsmInstr c_evalargs;

            vsm_opcode opcode() const noexcept { return opcode_; }

        private:
            vsm_opcode opcode_;
        };

        inline std::ostream &
        operator<<(std::ostream & os, VsmInstr x) {
            os << x.opcode();
            return os;
        }
    } /*namespace scm*/
} /*namespace xo*/

/* end VsmInstr.hpp */
