111 lines
2.4 KiB
C
111 lines
2.4 KiB
C
#include <stdio.h>
|
||
|
||
#include "util.h"
|
||
|
||
char *errors[] =
|
||
{
|
||
"Конс објекат мора бити правилна листа да би могао бити евалуиран",
|
||
"Неправилан конс \".\" оператер",
|
||
"Неправилан тип аргумента прослеђен функцији",
|
||
"Непознати симбол",
|
||
"Објекат није примењив",
|
||
"Дељење нулом",
|
||
"Функцији није прослеђен правилан број аргумената",
|
||
"Пређена је максимална дубина рекурзије",
|
||
"Невалидан карактер",
|
||
"Невалидна тараба-секвенца",
|
||
"Неочекивани крај фајла",
|
||
"Неочекивана заграда",
|
||
};
|
||
|
||
void printValue(object input);
|
||
|
||
void print(object input)
|
||
{
|
||
if (TYPE(input) == errorObject)
|
||
{
|
||
fprintf(stderr, "\nГРЕШКА: %s\n\n", errors[ERR(input)]);
|
||
}
|
||
else if (TYPE(input) != unspecifiedObject)
|
||
{
|
||
printf("\n");
|
||
printValue(input);
|
||
printf("\n\n");
|
||
}
|
||
}
|
||
|
||
void printValue(object input)
|
||
{
|
||
switch (TYPE(input))
|
||
{
|
||
case nilObject:
|
||
printf("()");
|
||
break;
|
||
case consObject:
|
||
printf("(");
|
||
object *currentCell = &input;
|
||
while (TYPE(*currentCell) == consObject)
|
||
{
|
||
printValue(CAR(*currentCell));
|
||
if (TYPE(CDR(*currentCell)) == consObject)
|
||
{
|
||
printf(" ");
|
||
}
|
||
currentCell = &CDR(*currentCell);
|
||
}
|
||
if (TYPE(*currentCell) != nilObject)
|
||
{
|
||
printf(" . ");
|
||
printValue(*currentCell);
|
||
}
|
||
printf(")");
|
||
break;
|
||
case numberObject:
|
||
if (NUM_TYPE(input) == fractionNum)
|
||
{
|
||
printf("%lld", NUM_NUMER(input));
|
||
if (NUM_DENOM(input) != 1)
|
||
{
|
||
printf("/%lld", NUM_DENOM(input));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
printf("%LF", NUM_REAL(input));
|
||
}
|
||
break;
|
||
case symbolObject:
|
||
printf("%s", SYM(input));
|
||
break;
|
||
case procedureObject:
|
||
printf("<процедура:%s>", PROC_TYPE(input) == builtinProc ?
|
||
"уграђена" : "сложена");
|
||
break;
|
||
case boolObject:
|
||
printf("#%s", BOOL(input) ? "и" : "л");
|
||
break;
|
||
case stringObject:
|
||
printf("\"%s\"", STR(input));
|
||
break;
|
||
case charObject:
|
||
printf("#\\");
|
||
switch (CHR(input))
|
||
{
|
||
case L' ':
|
||
printf("размак");
|
||
break;
|
||
case L'\n':
|
||
printf("новиред");
|
||
break;
|
||
case L'\t':
|
||
printf("табулар");
|
||
break;
|
||
default:
|
||
printf("%lc", CHR(input));
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|