cirilisp/util.h

190 lines
4.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <wchar.h>
#define TYPE(x) ((x).type)
#define CONS(x) ((x).value.consCell)
#define CAR(x) (((x).value.consCell)->car)
#define CDR(x) (((x).value.consCell)->cdr)
#define SYM(x) ((x).value.symbol)
#define STR(x) ((x).value.string)
#define CHR(x) ((x).value.character)
#define BOOL(x) ((x).value.boolean)
#define ERR(x) ((x).value.err)
#define SIGERR(error) \
{\
object result;\
TYPE(result) = errorObject;\
ERR(result) = error;\
return result;\
}
#define PROC(x) ((x).value.proc)
#define PROC_TYPE(x) ((x).value.proc->type)
#define PROC_BUILTIN(x) ((x).value.proc->value.builtin)
#define PROC_COMP_ARGS(x) ((x).value.proc->value.compound.args)
#define PROC_COMP_BODY(x) ((x).value.proc->value.compound.body)
#define PROC_COMP_ENV(x) ((x).value.proc->value.compound.environment)
#define NUM(x) ((x).value.num)
#define NUM_TYPE(x) ((x).value.num.type)
#define NUM_NUMER(x) ((x).value.num.value.fraction.numerator)
#define NUM_DENOM(x) ((x).value.num.value.fraction.denominator)
#define NUM_REAL(x) ((x).value.num.value.real)
typedef enum
{
nilObject,
unspecifiedObject,
consObject,
numberObject,
symbolObject,
procedureObject,
boolObject,
stringObject,
charObject,
errorObject
} dataType;
typedef enum
{
improperListError,
improperDotNotation,
typeError,
unrecognizedSymbolError,
notApplicableError,
divisionByZeroError,
argumentNumberError,
maxRecursionDepthError,
invalidCharacterError,
invalidHashSequenceError,
unexpectedEOFError,
unmatchedParenError,
} error;
typedef enum
{
fractionNum,
realNum
} numType;
typedef enum
{
builtinProc,
compoundProc
} procType;
typedef struct entry entry;
typedef struct frame frame;
typedef frame *env;
typedef struct number number;
typedef struct object object;
typedef struct cons cons;
typedef struct procedure procedure;
struct number
{
numType type;
union
{
long double real;
struct
{
long long int numerator;
long long int denominator;
} fraction;
} value;
};
struct object
{
dataType type;
union
{
error err;
char *symbol;
char *string;
wchar_t character;
cons *consCell;
number num;
procedure *proc;
int boolean;
} value;
};
struct cons
{
object car;
object cdr;
};
struct entry
{
char *name;
object value;
struct entry *left;
struct entry *right;
};
/* овај тип служи за имплементирање табеле симбола који помажу да се стварају
* променљиве и процедуре у ћирилиспу */
struct frame
{
entry *table;
env enclosing;
};
struct procedure
{
procType type;
union
{
object (*builtin)(object);
struct
{
object args;
object body;
env environment;
} compound;
} value;
};
env globalEnv;
/******************************* функције везане за окружења */
env createEnvironment(env enclosing);
void removeEnvironment(env input);
void addSymbolInternal(char *symbol, object (*function)());
void addSymbolVariable(char *symbol, object variable, env currentEnv);
/* функције помоћу којих се дефинишу нове променљиве: addSymbolVariable се
* позива током корисничких дефиниција у програму, док се addSymbolInternal
* користи у init.c да би се дефинисале "уграђене" процедуре */
int symbolExists(char *symbol, env currentEnv);
/* враћа 1 уколико симбол постоји и 0 у супротном */
object referVariable(char *symbol, env currentEnv);
/* враћа вредност на коју се односи име симбола у табели */
/******************************* */
int isSpecialForm(char *symbol);
int properList(object list);
int listLength(object list);
void deleteObject(object input);
object copyObject(object input);
object longlongToNumber(long long int input);
object shortenFractionNum(object a);
object exactToInexactNum(object a);
object inexactToExactNum(object a);
object plusNum(object a, object b);
object minusNum(object a);
object timesNum(object a, object b);
object inverseNum(object a);
procedure *createProcedure();