/programs/cmm/lisp/lisp.c |
---|
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 |
} |
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,7 → 104,7 |
code++; |
args++; |
} |
args -= 2; |
args--; |
ret = StdCall(args, name, dataArgs); |
free(name); |
free(dataArgs); |
108,16 → 111,18 |
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 |
code = EAX; |
loop() |
{ |
while(DSBYTE[code] == ' ') code++; |
if(DSBYTE[code]!='(') break; |
else code++; |
evalLisp(); |
133,17 → 139,19 |
} |
} |
} |
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(); |
/programs/cmm/lisp/stdcall.h |
---|
1,24 → 1,76 |
dword StdCall(dword count, name, args) |
:dword std_print(dword count, args) |
{ |
dword tmp = 0; |
if(!strcmp(name, "print")) |
consoleInit(); |
WHILE(count) |
{ |
consoleInit(); |
con_printf stdcall (DSDWORD[args]); |
args+=4; |
count--; |
} |
else if(!strcmp(name, "input")) |
{ |
} |
} |
else if(!strcmp(name, "str")) |
:dword std_str(dword count, args) |
{ |
dword tmp = 0; |
tmp = malloc(15); |
itoa_(tmp,DSDWORD[args]); |
return tmp; |
RETURN tmp; |
} |
else if(!strcmp(name, "exit")) |
:dword std_add(dword count, args) |
{ |
ExitProcess(); |
dword ret = 0; |
WHILE(count) |
{ |
ret += DSDWORD[args]; |
args+=4; |
count--; |
} |
return 0; |
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; |
functions.get(name); |
IF(EAX)RETURN EAX(count, args); |
RETURN 0; |
} |