90 lines
3 KiB
C
90 lines
3 KiB
C
#include <locale.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
|
||
#include "internals.h"
|
||
#include "read.h"
|
||
#include "eval.h"
|
||
#include "print.h"
|
||
|
||
extern int eofStatus;
|
||
int load(char *pathname)
|
||
{
|
||
FILE *stream;
|
||
if ((stream = fopen(pathname, "r")) == NULL)
|
||
{
|
||
return 0;
|
||
}
|
||
object exp;
|
||
while (TYPE(exp = eval(read("", stream), globalEnv)) != EOFObject)
|
||
deleteObject(exp);
|
||
eofStatus = 0;
|
||
fclose(stream);
|
||
return 1;
|
||
}
|
||
|
||
void init()
|
||
{
|
||
if (setlocale(LC_ALL, "sr_RS.utf8") == NULL)
|
||
{
|
||
fprintf(stderr, "lokal programa se nije mogao podesiti na\
|
||
\"sr_RS.utf8\", proverite da li ste ga osposobili na vasem sistemu\n");
|
||
exit(0);
|
||
}
|
||
/* Омогућава библиотекама коришћеним у интерпретеру да протумаче српску
|
||
* ћирилицу */
|
||
|
||
globalEnv = createEnvironment(NULL);
|
||
addSymbolInternal("+", &addInt, 0);
|
||
addSymbolInternal("-", &subtractInt, 0);
|
||
addSymbolInternal("*", &multiplyInt, 0);
|
||
addSymbolInternal("/", ÷Int, 0);
|
||
addSymbolInternal("навод", "eInt, 1);
|
||
addSymbolInternal("опиши", &defineInt, 1);
|
||
addSymbolInternal("опиши-складњу", &defineMacroInt, 1);
|
||
addSymbolInternal("тачно->нетачно", &exactToInexactInt, 0);
|
||
addSymbolInternal("нетачно->тачно", &inexactToExactInt, 0);
|
||
addSymbolInternal("ламбда", &lambdaInt, 1);
|
||
addSymbolInternal("<", &lessInt, 0);
|
||
addSymbolInternal(">", &greaterInt, 0);
|
||
addSymbolInternal("=", &eqNumInt, 0);
|
||
addSymbolInternal("ако", &ifInt, 1);
|
||
addSymbolInternal("нил?", &nilQInt, 0);
|
||
addSymbolInternal("конс?", &consQInt, 0);
|
||
addSymbolInternal("број?", &numberQInt, 0);
|
||
addSymbolInternal("симбол?", &symbolQInt, 0);
|
||
addSymbolInternal("процедура?", &procedureQInt, 0);
|
||
addSymbolInternal("булски?", &boolQInt, 0);
|
||
addSymbolInternal("ниска?", &stringQInt, 0);
|
||
addSymbolInternal("карактер?", &charQInt, 0);
|
||
addSymbolInternal("листа?", &listQInt, 0);
|
||
addSymbolInternal("надовежи", &appendInt, 0);
|
||
addSymbolInternal("конс", &consInt, 0);
|
||
addSymbolInternal("сар", &carInt, 0);
|
||
addSymbolInternal("сдр", &cdrInt, 0);
|
||
addSymbolInternal("јед?", &eqvQInt, 0);
|
||
addSymbolInternal("примени", &applyInt, 0);
|
||
addSymbolInternal("прикажи", &displayInt, 0);
|
||
addSymbolInternal("штампај", &printInt, 0);
|
||
addSymbolInternal("почни", &beginInt, 0);
|
||
addSymbolInternal("направи-ниску", &makeStrInt, 0);
|
||
addSymbolInternal("дужина-ниске", &strLengthInt, 0);
|
||
|
||
if (!load(DESTDIR"/usr/local/lib/cirilisp/инит.ћ"))
|
||
{
|
||
fprintf(stderr, "Није пронађена стандардна ЋИРЛИСП библиотека\
|
||
\nПрограм се није могао правилно покренути\n");
|
||
exit(0);
|
||
}
|
||
}
|
||
|
||
int main(int argc, char **argv)
|
||
{
|
||
init();
|
||
while (print(eval(read("ШКЉ> ", stdin), globalEnv)))
|
||
;
|
||
printf("\nДостигнут крај улазног тока.\nЗбогом и дођите нам опет!\n");
|
||
|
||
return 0;
|
||
}
|