#pragma once enum class ErrorCode { Success, OutOfMemory, IndexOutOfRange, TypeMismatch, ReadError, UnterminatedStringLiteral, InvalidNumericLiteral, NotImplemented, InvalidSymbol, MalformedList, KeyError, EndOfProgram, CompilationError, }; void seterr(const char* err); const char* geterr(void); #define STRINGIZE_NESTED(A) #A #define STRINGIZE(A) STRINGIZE_NESTED(A) #define ERROR(code) \ (({ \ seterr("Error " STRINGIZE(code) " at " __FILE__ ":" STRINGIZE(__LINE__)); \ ErrorCode::code; \ }))