// ops: name           arity: min max      type tests                opcode
_OP_DEF("load",               1,  1,       TST_STRING,               OP_LOAD)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_T0LVL)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_T1LVL)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_READ_INTERNAL)
_OP_DEF("gensym",             0,  1,       TST_STRING,               OP_GENSYM)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_VALUEPRINT)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_VALUEPRINT1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_EVAL)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_E0ARGS)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_E1ARGS)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_APPLY)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_DOMACRO)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LAMBDA)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LAMBDA1)
_OP_DEF("make-closure",       1,  2,       TST_PAIR TST_ENVIRONMENT, OP_MKCLOSURE)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_QUOTE)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_DEF0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_DEF1)
_OP_DEF("defined?",           1,  2,       TST_SYMBOL TST_ENVIRONMENT, OP_DEFP)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_BEGIN)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_IF0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_IF1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_SET0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_SET1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET2)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET0AST)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET1AST)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET2AST)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET0REC)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET1REC)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_LET2REC)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_COND0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_COND1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_DELAY)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_AND0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_AND1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_OR0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_OR1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_C0STREAM)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_C1STREAM)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_MACRO0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_MACRO1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_CASE0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_CASE1)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_CASE2)
_OP_DEF("eval",               1,  2,       TST_ANY TST_ENVIRONMENT,  OP_PEVAL)
_OP_DEF("apply",              1,  INF_ARG, TST_PROCEDURE TST_ANY,    OP_PAPPLY)
_OP_DEF("call-with-current-continuation", 1, 1, TST_PROCEDURE,       OP_CONTINUATION)
_OP_DEF("values",             0,  INF_ARG, TST_ANY,                  OP_VALUES)
_OP_DEF("call-with-values",   2,  2,       TST_PROCEDURE TST_PROCEDURE, OP_CALLWV0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_CALLWV1)
#if USE_MATH
_OP_DEF("exact",              1,  1,       TST_NUMBER,               OP_INEX2EX)
_OP_DEF("exp",                1,  1,       TST_NUMBER,               OP_EXP)
_OP_DEF("log",                1,  1,       TST_NUMBER,               OP_LOG)
_OP_DEF("sin",                1,  1,       TST_NUMBER,               OP_SIN)
_OP_DEF("cos",                1,  1,       TST_NUMBER,               OP_COS)
_OP_DEF("tan",                1,  1,       TST_NUMBER,               OP_TAN)
_OP_DEF("asin",               1,  1,       TST_NUMBER,               OP_ASIN)
_OP_DEF("acos",               1,  1,       TST_NUMBER,               OP_ACOS)
_OP_DEF("atan",               1,  2,       TST_NUMBER,               OP_ATAN)
_OP_DEF("sqrt",               1,  1,       TST_NUMBER,               OP_SQRT)
_OP_DEF("expt",               2,  2,       TST_NUMBER,               OP_EXPT)
_OP_DEF("floor",              1,  1,       TST_NUMBER,               OP_FLOOR)
_OP_DEF("ceiling",            1,  1,       TST_NUMBER,               OP_CEILING)
_OP_DEF("round",              1,  1,       TST_NUMBER,               OP_ROUND)
#endif
_OP_DEF("+",                  0,  INF_ARG, TST_NUMBER,               OP_ADD)
_OP_DEF("-",                  1,  INF_ARG, TST_NUMBER,               OP_SUB)
_OP_DEF("*",                  0,  INF_ARG, TST_NUMBER,               OP_MUL)
_OP_DEF("/",                  1,  INF_ARG, TST_NUMBER,               OP_DIV)
_OP_DEF("remainder",          2,  2,       TST_INTEGER,              OP_REM)
_OP_DEF("modulo",             2,  2,       TST_INTEGER,              OP_MOD)
_OP_DEF("car",                1,  1,       TST_PAIR,                 OP_CAR)
_OP_DEF("cdr",                1,  1,       TST_PAIR,                 OP_CDR)
_OP_DEF("cons",               2,  2,       TST_NONE,                 OP_CONS)
_OP_DEF("set-car!",           2,  2,       TST_PAIR TST_ANY,         OP_SETCAR)
_OP_DEF("set-cdr!",           2,  2,       TST_PAIR TST_ANY,         OP_SETCDR)
_OP_DEF("length",             1,  1,       TST_LIST,                 OP_LIST_LENGTH)
_OP_DEF("reverse",            1,  1,       TST_LIST,                 OP_REVERSE)
_OP_DEF("list*",              1,  INF_ARG, TST_NONE,                 OP_LIST_STAR)
_OP_DEF("append",             0,  INF_ARG, TST_NONE,                 OP_APPEND)
#if USE_PLIST
_OP_DEF("put",                3,  3,       TST_NONE,                 OP_PUT)
_OP_DEF("get",                2,  2,       TST_NONE,                 OP_GET)
#endif
_OP_DEF("char->integer",      1,  1,       TST_CHAR,                 OP_CHAR2INT)
_OP_DEF("integer->char",      1,  1,       TST_NATURAL,              OP_INT2CHAR)
_OP_DEF("char-upcase",        1,  1,       TST_CHAR,                 OP_CHARUPCASE)
_OP_DEF("char-downcase",      1,  1,       TST_CHAR,                 OP_CHARDNCASE)
_OP_DEF("symbol->string",     1,  1,       TST_SYMBOL,               OP_SYM2STR)
_OP_DEF("atom->string",       1,  2,       TST_ANY TST_NATURAL,      OP_ATOM2STR)
_OP_DEF("string->symbol",     1,  1,       TST_STRING,               OP_STR2SYM)
_OP_DEF("string->atom",       1,  2,       TST_STRING TST_NATURAL,   OP_STR2ATOM)
_OP_DEF("make-string",        1,  2,       TST_NATURAL TST_CHAR,     OP_MKSTRING)
_OP_DEF("string-length",      1,  1,       TST_STRING,               OP_STRLEN)
_OP_DEF("string-ref",         2,  2,       TST_STRING TST_NATURAL,   OP_STRREF)
_OP_DEF("string-set!",        3,  3,       TST_STRING TST_NATURAL TST_CHAR, OP_STRSET)
_OP_DEF("string-append",      0,  INF_ARG, TST_STRING,               OP_STRAPPEND)
_OP_DEF("substring",          2,  3,       TST_STRING TST_NATURAL,   OP_SUBSTR)
_OP_DEF("vector",             0,  INF_ARG, TST_NONE,                 OP_VECTOR)
_OP_DEF("make-vector",        1,  2,       TST_NATURAL TST_ANY,      OP_MKVECTOR)
_OP_DEF("vector-length",      1,  1,       TST_VECTOR,               OP_VECLEN)
_OP_DEF("vector-ref",         2,  2,       TST_VECTOR TST_NATURAL,   OP_VECREF)
_OP_DEF("vector-set!",        3,  3,       TST_VECTOR TST_NATURAL TST_ANY, OP_VECSET)
_OP_DEF("bytevector",         0,  INF_ARG, TST_NONE,                 OP_BVECTOR)
_OP_DEF("make-bytevector",    1,  2,       TST_NATURAL TST_NATURAL,  OP_MKBVECTOR)
_OP_DEF("bytevector-u8-ref",  2,  2,       TST_BVECTOR TST_NATURAL,  OP_BVECREF)
_OP_DEF("bytevector-u8-set!", 3,  3,       TST_BVECTOR TST_NATURAL TST_NATURAL, OP_BVECSET)
_OP_DEF("bytevector-length",  1,  1,       TST_BVECTOR,              OP_BVECLEN)
_OP_DEF("struct",             1,  INF_ARG, TST_SYMBOL,               OP_STRUCT)
_OP_DEF("make-struct",        2,  2,       TST_SYMBOL TST_NATURAL,   OP_MKSTRUCT)
_OP_DEF("struct-length",      1,  1,       TST_STRUCT,               OP_STRUCTLEN)
_OP_DEF("struct-name",        1,  1,       TST_STRUCT,               OP_STRUCTNAME)
_OP_DEF("struct-ref",         2,  2,       TST_STRUCT TST_NATURAL,   OP_STRUCTREF)
_OP_DEF("struct-set!",        3,  3,       TST_STRUCT TST_NATURAL TST_ANY, OP_STRUCTSET)
_OP_DEF("not",                1,  1,       TST_NONE,                 OP_NOT)
_OP_DEF("boolean?",           1,  1,       TST_NONE,                 OP_BOOLP)
_OP_DEF("eof-object?",        1,  1,       TST_NONE,                 OP_EOFOBJP)
_OP_DEF("null?",              1,  1,       TST_NONE,                 OP_NULLP)
_OP_DEF("=",                  2,  INF_ARG, TST_NUMBER,               OP_NUMEQ)
_OP_DEF("<",                  2,  INF_ARG, TST_NUMBER,               OP_LESS)
_OP_DEF(">",                  2,  INF_ARG, TST_NUMBER,               OP_GRE)
_OP_DEF("<=",                 2,  INF_ARG, TST_NUMBER,               OP_LEQ)
_OP_DEF(">=",                 2,  INF_ARG, TST_NUMBER,               OP_GEQ)
_OP_DEF("symbol?",            1,  1,       TST_ANY,                  OP_SYMBOLP)
_OP_DEF("number?",            1,  1,       TST_ANY,                  OP_NUMBERP)
_OP_DEF("string?",            1,  1,       TST_ANY,                  OP_STRINGP)
_OP_DEF("integer?",           1,  1,       TST_ANY,                  OP_INTEGERP)
_OP_DEF("real?",              1,  1,       TST_ANY,                  OP_REALP)
_OP_DEF("char?",              1,  1,       TST_ANY,                  OP_CHARP)
#if USE_CHAR_CLASSIFIERS
_OP_DEF("char-alphabetic?",   1,  1,       TST_CHAR,                 OP_CHARAP)
_OP_DEF("char-numeric?",      1,  1,       TST_CHAR,                 OP_CHARNP)
_OP_DEF("char-whitespace?",   1,  1,       TST_CHAR,                 OP_CHARWP)
_OP_DEF("char-upper-case?",   1,  1,       TST_CHAR,                 OP_CHARUP)
_OP_DEF("char-lower-case?",   1,  1,       TST_CHAR,                 OP_CHARLP)
#endif
_OP_DEF("port?",              1,  1,       TST_ANY,                  OP_PORTP)
_OP_DEF("input-port?",        1,  1,       TST_ANY,                  OP_INPORTP)
_OP_DEF("output-port?",       1,  1,       TST_ANY,                  OP_OUTPORTP)
_OP_DEF("procedure?",         1,  1,       TST_ANY,                  OP_PROCP)
_OP_DEF("pair?",              1,  1,       TST_ANY,                  OP_PAIRP)
_OP_DEF("list?",              1,  1,       TST_ANY,                  OP_LISTP)
_OP_DEF("environment?",       1,  1,       TST_ANY,                  OP_ENVP)
_OP_DEF("vector?",            1,  1,       TST_ANY,                  OP_VECTORP)
_OP_DEF("bytevector?",        1,  1,       TST_ANY,                  OP_BVECTORP)
_OP_DEF("struct?",            1,  1,       TST_ANY,                  OP_STRUCTP)
_OP_DEF("eq?",                2,  2,       TST_ANY,                  OP_EQ)
_OP_DEF("eqv?",               2,  2,       TST_ANY,                  OP_EQV)
_OP_DEF("current-second",     0,  0,       nullptr,                  OP_CURR_SEC)
_OP_DEF("eval-count",         0,  0,       nullptr,                  OP_EVAL_CNT)
_OP_DEF("force",              1,  1,       TST_ANY,                  OP_FORCE)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_SAVE_FORCED)
_OP_DEF("write",              1,  2,       TST_ANY TST_OUTPORT,      OP_WRITE)
_OP_DEF("write-char",         1,  2,       TST_CHAR TST_OUTPORT,     OP_WRITE_CHAR)
_OP_DEF("display",            1,  2,       TST_ANY TST_OUTPORT,      OP_DISPLAY)
_OP_DEF("write-u8",           1,  2,       TST_NATURAL TST_OUTPORT,  OP_WRITE_U8)
_OP_DEF("newline",            0,  1,       TST_OUTPORT,              OP_NEWLINE)
_OP_DEF("error",              1,  INF_ARG, TST_NONE,                 OP_ERR0)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_ERR1)
_OP_DEF("quit",               0,  1,       TST_NUMBER,               OP_QUIT)
_OP_DEF("gc",                 0,  0,       nullptr,                  OP_GC)
_OP_DEF("gc-verbose",         0,  1,       TST_NONE,                 OP_GCVERB)
_OP_DEF("new-segment",        0,  1,       TST_NUMBER,               OP_NEWSEGMENT)
_OP_DEF("oblist",             0,  0,       nullptr,                  OP_OBLIST)
_OP_DEF("current-input-port", 0,  0,       nullptr,                  OP_CURR_INPORT)
_OP_DEF("current-output-port", 0, 0,       nullptr,                  OP_CURR_OUTPORT)
_OP_DEF("open-input-file",    1,  1,       TST_STRING,               OP_OPEN_INFILE)
_OP_DEF("open-output-file",   1,  1,       TST_STRING,               OP_OPEN_OUTFILE)
_OP_DEF("open-input-output-file", 1, 1,    TST_STRING,               OP_OPEN_INOUTFILE)
#if USE_STRING_PORTS
_OP_DEF("open-input-string",  1,  1,       TST_STRING,               OP_OPEN_INSTRING)
_OP_DEF("open-input-output-string", 1, 1,  TST_STRING,               OP_OPEN_INOUTSTRING)
_OP_DEF("open-output-string", 0,  1,       TST_STRING,               OP_OPEN_OUTSTRING)
_OP_DEF("get-output-string",  1,  1,       TST_OUTPORT,              OP_GET_OUTSTRING)
#endif
_OP_DEF("close-input-port",   1,  1,       TST_INPORT,               OP_CLOSE_INPORT)
_OP_DEF("close-output-port",  1,  1,       TST_OUTPORT,              OP_CLOSE_OUTPORT)
_OP_DEF("interaction-environment", 0, 0,   nullptr,                  OP_INT_ENV)
_OP_DEF("current-environment", 0, 0,       nullptr,                  OP_CURR_ENV)
_OP_DEF("read",               0,  1,       TST_INPORT,               OP_READ)
_OP_DEF("read-char",          0,  1,       TST_INPORT,               OP_READ_CHAR)
_OP_DEF("peek-char",          0,  1,       TST_INPORT,               OP_PEEK_CHAR)
_OP_DEF("read-u8",            0,  1,       TST_INPORT,               OP_READ_U8)
_OP_DEF("peek-u8",            0,  1,       TST_INPORT,               OP_PEEK_U8)
_OP_DEF("char-ready?",        0,  1,       TST_INPORT,               OP_CHAR_READY)
_OP_DEF("set-input-port",     1,  1,       TST_INPORT,               OP_SET_INPORT)
_OP_DEF("set-output-port",    1,  1,       TST_OUTPORT,              OP_SET_OUTPORT)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDSEXPR)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDLIST)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDDOT)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDQUOTE)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDQQUOTE)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDQQUOTEVEC)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDUNQUOTE)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDUQTSP)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDVEC)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_RDBVEC)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_P0LIST)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_P1LIST)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_PVECFROM)
_OP_DEF(nullptr,              0,  0,       nullptr,                  OP_PBVECFROM)
_OP_DEF("assq",               2,  2,       TST_NONE,                 OP_ASSQ)
_OP_DEF("get-closure-code",   1,  1,       TST_NONE,                 OP_GET_CLOSURE)
_OP_DEF("closure?",           1,  1,       TST_NONE,                 OP_CLOSUREP)
_OP_DEF("macro?",             1,  1,       TST_NONE,                 OP_MACROP)
_OP_DEF("procedure-arity",    1,  1,       TST_PROCEDURE,            OP_ARITY)
#undef _OP_DEF
