forked from KolibriOS/kolibrios
Lisp v1.2
git-svn-id: svn://kolibrios.org@7563 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
0cb21a159b
commit
a592ede59c
@ -6,8 +6,11 @@
|
||||
|
||||
#include "../lib/io.h"
|
||||
#include "../lib/obj/console.h"
|
||||
#include "../lib/array.h"
|
||||
|
||||
byte initConsole = 0;
|
||||
Dictionary functions = {0};
|
||||
Dictionary variables = {0};
|
||||
|
||||
#include "stdcall.h"
|
||||
|
||||
@ -63,9 +66,9 @@ dword evalLisp()
|
||||
}
|
||||
if (!args)
|
||||
{
|
||||
if(s>='A') && (s<='z') // name function
|
||||
if(s!=' ') && (s!=')') // name function
|
||||
{
|
||||
while (s>='A') && (s<='z')
|
||||
while (s!=' ') && (s!=')')
|
||||
{
|
||||
DSBYTE[pos] = s;
|
||||
code++;
|
||||
@ -101,23 +104,25 @@ dword evalLisp()
|
||||
code++;
|
||||
args++;
|
||||
}
|
||||
args -= 2;
|
||||
args--;
|
||||
ret = StdCall(args, name, dataArgs);
|
||||
free(name);
|
||||
free(dataArgs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
dword brainFuckCode = 0;
|
||||
word maxLoop = 1000;
|
||||
dword txt = "(print (str 1) (str 2))";
|
||||
|
||||
buffer = malloc(bufferSize);
|
||||
memory = malloc(memoryBrainfuck);
|
||||
stack = malloc(stackBrainFuck);
|
||||
|
||||
Init();
|
||||
|
||||
IF(DSBYTE[I_Param])
|
||||
{
|
||||
IF(io.read(I_Param))
|
||||
@ -125,6 +130,7 @@ void main()
|
||||
code = EAX;
|
||||
loop()
|
||||
{
|
||||
while(DSBYTE[code] == ' ') code++;
|
||||
if(DSBYTE[code]!='(') break;
|
||||
else code++;
|
||||
evalLisp();
|
||||
@ -133,17 +139,19 @@ void main()
|
||||
}
|
||||
}
|
||||
}
|
||||
ELSE
|
||||
else
|
||||
{
|
||||
consoleInit();
|
||||
con_printf stdcall ("Lisp interpreter v1.0");
|
||||
con_printf stdcall ("Lisp interpreter v1.2");
|
||||
WHILE(maxLoop)
|
||||
{
|
||||
con_printf stdcall ("\r\n\r\nEnter code: ");
|
||||
con_gets stdcall(buffer, bufferSize);
|
||||
code = EAX;
|
||||
code = txt;
|
||||
con_printf stdcall ("Output: ");
|
||||
nextLispLine:
|
||||
while(DSBYTE[code] == ' ') code++;
|
||||
if(DSBYTE[code]!='(') continue;
|
||||
else code++;
|
||||
evalLisp();
|
||||
|
@ -1,24 +1,76 @@
|
||||
:dword std_print(dword count, args)
|
||||
{
|
||||
consoleInit();
|
||||
WHILE(count)
|
||||
{
|
||||
con_printf stdcall (DSDWORD[args]);
|
||||
args+=4;
|
||||
count--;
|
||||
}
|
||||
}
|
||||
|
||||
:dword std_str(dword count, args)
|
||||
{
|
||||
dword tmp = 0;
|
||||
tmp = malloc(15);
|
||||
itoa_(tmp,DSDWORD[args]);
|
||||
RETURN tmp;
|
||||
}
|
||||
|
||||
:dword std_add(dword count, args)
|
||||
{
|
||||
dword ret = 0;
|
||||
WHILE(count)
|
||||
{
|
||||
ret += DSDWORD[args];
|
||||
args+=4;
|
||||
count--;
|
||||
}
|
||||
RETURN ret;
|
||||
}
|
||||
|
||||
:dword std_sub(dword count, args)
|
||||
{
|
||||
dword ret = 0;
|
||||
IF(count)
|
||||
{
|
||||
ret = DSDWORD[args];
|
||||
count--;
|
||||
args+=4;
|
||||
}
|
||||
WHILE(count)
|
||||
{
|
||||
ret -= DSDWORD[args];
|
||||
args+=4;
|
||||
count--;
|
||||
}
|
||||
RETURN ret;
|
||||
}
|
||||
|
||||
void Init()
|
||||
{
|
||||
functions.init(100);
|
||||
|
||||
/* Console functions */
|
||||
functions.set("print", #std_print);
|
||||
|
||||
/* String functions */
|
||||
functions.set("str", #std_str);
|
||||
|
||||
/* System functions */
|
||||
functions.set("exit", #ExitProcess);
|
||||
|
||||
/* Math functions */
|
||||
functions.set("+", #std_add);
|
||||
functions.set("-", #std_sub);
|
||||
|
||||
variables.init(100);
|
||||
}
|
||||
|
||||
dword StdCall(dword count, name, args)
|
||||
{
|
||||
dword tmp = 0;
|
||||
if(!strcmp(name, "print"))
|
||||
{
|
||||
consoleInit();
|
||||
con_printf stdcall (DSDWORD[args]);
|
||||
}
|
||||
else if(!strcmp(name, "input"))
|
||||
{
|
||||
|
||||
}
|
||||
else if(!strcmp(name, "str"))
|
||||
{
|
||||
tmp = malloc(15);
|
||||
itoa_(tmp,DSDWORD[args]);
|
||||
return tmp;
|
||||
}
|
||||
else if(!strcmp(name, "exit"))
|
||||
{
|
||||
ExitProcess();
|
||||
}
|
||||
return 0;
|
||||
functions.get(name);
|
||||
IF(EAX)RETURN EAX(count, args);
|
||||
RETURN 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user