forked from KolibriOS/kolibrios
Lisp v1.3 stable version
git-svn-id: svn://kolibrios.org@7565 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
1ffceb0340
commit
5cafe795a0
@ -50,8 +50,7 @@ dword evalLisp()
|
|||||||
dword p = 0;
|
dword p = 0;
|
||||||
dataArgs = malloc(16*4);
|
dataArgs = malloc(16*4);
|
||||||
posArgs = dataArgs;
|
posArgs = dataArgs;
|
||||||
name = malloc(100);
|
|
||||||
pos = name;
|
|
||||||
loop()
|
loop()
|
||||||
{
|
{
|
||||||
s = DSBYTE[code];
|
s = DSBYTE[code];
|
||||||
@ -61,35 +60,45 @@ dword evalLisp()
|
|||||||
code++;
|
code++;
|
||||||
s = DSBYTE[code];
|
s = DSBYTE[code];
|
||||||
}
|
}
|
||||||
|
if (!s) return 0;
|
||||||
if (!s) || (s==')')
|
if (s==')')
|
||||||
{
|
{
|
||||||
code++;
|
code++;
|
||||||
break;
|
args--;
|
||||||
|
ret = StdCall(args, name, dataArgs);
|
||||||
|
free(name);
|
||||||
|
//free(dataArgs);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
if(s == '(')
|
||||||
if (!args)
|
{
|
||||||
|
code++;
|
||||||
|
DSDWORD[posArgs] = evalLisp();
|
||||||
|
args++;
|
||||||
|
posArgs += 4;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (!args)
|
||||||
{
|
{
|
||||||
if (s != ')') // name function
|
if (s != ')') // name function
|
||||||
{
|
{
|
||||||
while (s != ' ') && (s != ')')
|
name = malloc(100);
|
||||||
|
pos = name;
|
||||||
|
while (s) && (s != ' ') && (s != ')')
|
||||||
{
|
{
|
||||||
DSBYTE[pos] = s;
|
DSBYTE[pos] = s;
|
||||||
pos++;
|
pos++;
|
||||||
code++;
|
code++;
|
||||||
s = DSBYTE[code];
|
s = DSBYTE[code];
|
||||||
}
|
}
|
||||||
code--;
|
DSBYTE[pos] = 0;
|
||||||
|
args++;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(s == '(')
|
if (s >= '0') && (s <= '9')
|
||||||
{
|
|
||||||
code++;
|
|
||||||
tmp = evalLisp();
|
|
||||||
}
|
|
||||||
else if (s >= '0') && (s <= '9')
|
|
||||||
{
|
{
|
||||||
tmp = 0;
|
tmp = 0;
|
||||||
while (s >= '0') && (s <= '9')
|
while (s >= '0') && (s <= '9')
|
||||||
@ -99,7 +108,10 @@ dword evalLisp()
|
|||||||
code++;
|
code++;
|
||||||
s = DSBYTE[code];
|
s = DSBYTE[code];
|
||||||
}
|
}
|
||||||
code--;
|
args++;
|
||||||
|
DSDWORD[posArgs] = tmp;
|
||||||
|
posArgs += 4;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
else if (s == '"')
|
else if (s == '"')
|
||||||
{
|
{
|
||||||
@ -130,6 +142,10 @@ dword evalLisp()
|
|||||||
s = DSBYTE[code];
|
s = DSBYTE[code];
|
||||||
}
|
}
|
||||||
DSBYTE[p] = 0;
|
DSBYTE[p] = 0;
|
||||||
|
args++;
|
||||||
|
DSDWORD[posArgs] = tmp;
|
||||||
|
posArgs += 4;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DSDWORD[posArgs] = tmp;
|
DSDWORD[posArgs] = tmp;
|
||||||
@ -141,7 +157,7 @@ dword evalLisp()
|
|||||||
args--;
|
args--;
|
||||||
ret = StdCall(args, name, dataArgs);
|
ret = StdCall(args, name, dataArgs);
|
||||||
free(name);
|
free(name);
|
||||||
free(dataArgs);
|
//free(dataArgs);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +165,7 @@ void main()
|
|||||||
{
|
{
|
||||||
dword brainFuckCode = 0;
|
dword brainFuckCode = 0;
|
||||||
word maxLoop = 1000;
|
word maxLoop = 1000;
|
||||||
dword txt = " (print 1)(print 2)";
|
dword txt = "(print (input \"test:\"))";
|
||||||
|
|
||||||
buffer = malloc(bufferSize);
|
buffer = malloc(bufferSize);
|
||||||
memory = malloc(memoryBrainfuck);
|
memory = malloc(memoryBrainfuck);
|
||||||
@ -177,7 +193,7 @@ void main()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
consoleInit();
|
consoleInit();
|
||||||
con_printf stdcall ("Lisp interpreter v1.2");
|
con_printf stdcall ("Lisp interpreter v1.3");
|
||||||
while(maxLoop)
|
while(maxLoop)
|
||||||
{
|
{
|
||||||
con_printf stdcall ("\r\n\r\nEnter code: ");
|
con_printf stdcall ("\r\n\r\nEnter code: ");
|
||||||
@ -185,17 +201,7 @@ void main()
|
|||||||
code = EAX;
|
code = EAX;
|
||||||
//code = txt;
|
//code = txt;
|
||||||
con_printf stdcall ("Output: ");
|
con_printf stdcall ("Output: ");
|
||||||
nextLispLine:
|
|
||||||
while(DSBYTE[code] == ' ') code++;
|
|
||||||
if(DSBYTE[code] == '(') code++;
|
|
||||||
else goto endNext;
|
|
||||||
evalLisp();
|
evalLisp();
|
||||||
code--;
|
|
||||||
if(DSBYTE[code]==')') code++;
|
|
||||||
else goto endNext;
|
|
||||||
IF(!DSBYTE[code]) goto endNext;
|
|
||||||
goto nextLispLine;
|
|
||||||
endNext:
|
|
||||||
maxLoop--;
|
maxLoop--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,45 +1,36 @@
|
|||||||
|
|
||||||
|
/* Lisp functions */
|
||||||
dword std_print(dword count, args)
|
|
||||||
{
|
|
||||||
consoleInit();
|
|
||||||
count = 1;
|
|
||||||
WHILE(count)
|
|
||||||
{
|
|
||||||
con_printf stdcall (DSDWORD[args]);
|
|
||||||
args+=4;
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:dword std_set(dword count, args)
|
:dword std_set(dword count, args)
|
||||||
{
|
{
|
||||||
dword name = 0;
|
dword name = 0;
|
||||||
dword value = 0;
|
dword value = 0;
|
||||||
WHILE(count>0)
|
WHILE(count > 0)
|
||||||
{
|
{
|
||||||
name = DSDWORD[args];
|
name = DSDWORD[args];
|
||||||
args += 4;
|
args += 4;
|
||||||
value = DSDWORD[args];
|
value = DSDWORD[args];
|
||||||
args += 4;
|
args += 4;
|
||||||
variables.set(name, value);
|
variables.set(name, value);
|
||||||
count-=2;
|
count -= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:dword std_get(dword count, args)
|
:dword std_get(dword count, args)
|
||||||
{
|
{
|
||||||
|
IF(!count) RETURN 0;
|
||||||
RETURN variables.get(DSDWORD[args]);
|
RETURN variables.get(DSDWORD[args]);
|
||||||
}
|
}
|
||||||
|
|
||||||
:dword std_str(dword count, args)
|
:dword std_str(dword count, args)
|
||||||
{
|
{
|
||||||
dword tmp = 0;
|
dword tmp = 0;
|
||||||
|
IF(!count) RETURN "";
|
||||||
tmp = malloc(15);
|
tmp = malloc(15);
|
||||||
itoa_(tmp,DSDWORD[args]);
|
itoa_(tmp,DSDWORD[args]);
|
||||||
RETURN tmp;
|
RETURN tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Math functions */
|
||||||
:dword std_add(dword count, args)
|
:dword std_add(dword count, args)
|
||||||
{
|
{
|
||||||
dword ret = 0;
|
dword ret = 0;
|
||||||
@ -64,18 +55,46 @@ dword std_print(dword count, args)
|
|||||||
WHILE(count)
|
WHILE(count)
|
||||||
{
|
{
|
||||||
ret -= DSDWORD[args];
|
ret -= DSDWORD[args];
|
||||||
|
args += 4;
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
RETURN ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Console functions */
|
||||||
|
:dword std_print(dword count, args)
|
||||||
|
{
|
||||||
|
dword ret = 0;
|
||||||
|
WHILE(count)
|
||||||
|
{
|
||||||
|
con_printf stdcall (DSDWORD[args]);
|
||||||
args+=4;
|
args+=4;
|
||||||
count--;
|
count--;
|
||||||
}
|
}
|
||||||
RETURN ret;
|
RETURN ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:dword std_input(dword count, args)
|
||||||
|
{
|
||||||
|
dword buf = 0;
|
||||||
|
buf = malloc(100);
|
||||||
|
WHILE(count)
|
||||||
|
{
|
||||||
|
con_printf stdcall (DSDWORD[args]);
|
||||||
|
args+=4;
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
con_gets stdcall(buf, 100);
|
||||||
|
RETURN EAX;
|
||||||
|
}
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
functions.init(100);
|
functions.init(100);
|
||||||
|
|
||||||
/* Console functions */
|
/* Console functions */
|
||||||
|
functions.set("print", #std_print);
|
||||||
|
functions.set("input", #std_input);
|
||||||
|
|
||||||
/* String functions */
|
/* String functions */
|
||||||
functions.set("str", #std_str);
|
functions.set("str", #std_str);
|
||||||
@ -96,21 +115,8 @@ void Init()
|
|||||||
|
|
||||||
dword StdCall(dword count, name, args)
|
dword StdCall(dword count, name, args)
|
||||||
{
|
{
|
||||||
dword tmp = 0;
|
|
||||||
|
|
||||||
functions.get(name);
|
functions.get(name);
|
||||||
IF(EAX) RETURN EAX(count, args);
|
IF(EAX) RETURN EAX(count, args);
|
||||||
IF(!strcmp(name, "print"))
|
|
||||||
{
|
|
||||||
consoleInit();
|
|
||||||
count = 1;
|
|
||||||
WHILE(count)
|
|
||||||
{
|
|
||||||
con_printf stdcall (DSDWORD[args]);
|
|
||||||
args += 4;
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RETURN 0;
|
RETURN 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user