Login
7 branches 0 tags
Ben (X13/Arch) WIP a25bc3e 3 years ago 651 Commits
nujel / lib / type-system.h
#ifndef NUJEL_LIB_TYPE_SYSTEM
#define NUJEL_LIB_TYPE_SYSTEM

#include "nujel.h"
#include "type/vec.h"

i64             castToInt   (const lVal *v, i64 fallback);
bool            castToBool  (const lVal *v);
const char *    castToString(const lVal *v, const char *fallback);

NORETURN void   throwTypeError      (lClosure *c, lVal *v, lType T);
NORETURN void   throwArityError     (lClosure *c, lVal *v, int arity);
void            requireCertainType  (lClosure *c, lVal *v, lType T);
vec             requireVec          (lClosure *c, lVal *v);
vec             requireVecCompatible(lClosure *c, lVal *v);
i64             requireInt          (lClosure *c, lVal *v);
i64             requireNaturalInt   (lClosure *c, lVal *v);
double          requireFloat        (lClosure *c, lVal *v);
lArray *        requireArray        (lClosure *c, lVal *v);
const lSymbol * requireSymbol       (lClosure *c, lVal *v);
const lSymbol * requireKeyword      (lClosure *c, lVal *v);
const lSymbol * requireSymbolic     (lClosure *c, lVal *v);
lString *       requireString       (lClosure *c, lVal *v);
lTree *         requireTree         (lClosure *c, lVal *v);
lTree *         requireMutableTree  (lClosure *c, lVal *v);
lBytecodeOp     requireBytecodeOp   (lClosure *c, lVal *v);
lBytecodeArray *requireBytecodeArray(lClosure *c, lVal *v);
lClosure       *requireClosure      (lClosure *c, lVal *v);

lType lTypecast         (const lType a, const lType b);

static inline bool isComment(lVal *v){return v && v->type == ltComment;}


#endif