Login
7 branches 0 tags
Ben (X13/Arch) Experimental Cosmopolitan libc target a3c81d6 4 years ago 72 Commits
nujel / lib / datatypes / symbol.h
#pragma once
#include "../nujel.h"

struct lSymbol {
	char c[32];
};

#define SYM_MAX (1<<14)
#define SYM_MASK ((SYM_MAX)-1)
extern lSymbol  lSymbolList [SYM_MAX];
extern uint     lSymbolMax;

#define lvSym(i)  (i == 0 ? symNull : &lSymbolList[i & SYM_MASK])
#define lvSymI(s) (s == NULL ? 0 : s - lSymbolList)
#define lGetSymbol(v) (((v == NULL) || (v->type != ltSymbol)) ? symNull : lvSym(v->vCdr))

extern lSymbol *symNull,*symQuote,*symArr,*symIf,*symCond,*symWhen,*symUnless,*symLet,*symDo,*symMinus,*symLambda,*symLambdAst;
extern lSymbol *lSymLTNoAlloc, *lSymLTBool, *lSymLTPair, *lSymLTLambda, *lSymLTInt, *lSymLTFloat, *lSymLTVec, *lSymLTString, *lSymLTSymbol, *lSymLTNativeFunction, *lSymLTSpecialForm, *lSymLTInfinity, *lSymLTArray, *lSymLTGUIWidget;

void      lInitSymbol  ();
lVal     *lValSymS     (const lSymbol *s);
lVal     *lValSym      (const char *s);
lSymbol  *lSymS        (const char *s);
lSymbol  *lSymSL       (const char *s, uint len);

int       lSymCmp      (const lVal *a,const lVal *b);
int       lSymEq       (const lSymbol *a,const lSymbol *b);

bool      lSymVariadic (const lSymbol *s);
bool      lSymNoEval   (const lSymbol *s);
bool      lSymKeyword  (const lSymbol *s);