diff --git a/programs/cmm/lisp/lisp.c b/programs/cmm/lisp/lisp.c index 5eb4ab15bd..eafba65838 100644 --- a/programs/cmm/lisp/lisp.c +++ b/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 @@ 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(); diff --git a/programs/cmm/lisp/stdcall.h b/programs/cmm/lisp/stdcall.h index 261d579ade..3ecc407d4f 100644 --- a/programs/cmm/lisp/stdcall.h +++ b/programs/cmm/lisp/stdcall.h @@ -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; } \ No newline at end of file