#pragma once enum class ErrorCode { Success, OutOfMemory, IndexOutOfRange, TypeMismatch, ReadError, UnterminatedStringLiteral, InvalidNumericLiteral, NotImplemented, InvalidSymbol, MalformedList, KeyError, EndOfProgram, CompilationError, ArgumentCountMismatch, IOError, Interrupt, AssertionFailed, DivisionByZero, SyntaxError, }; class Value; template class Result; void seterr(const char* err); const char* geterr(void); const Value& geterrobj(void); Result seterrobj(const Value&); void reseterrobj(); #define STRINGIZE_NESTED(A) #A #define STRINGIZE(A) STRINGIZE_NESTED(A) #define ERROR(code) \ (({ \ reseterrobj(); \ seterr("Error " STRINGIZE(code) " at " __FILE__ ":" STRINGIZE(__LINE__)); \ ErrorCode::code; \ }))