1
0

組み込み関数を実�

This commit is contained in:
otya128
2015-07-11 19:32:31 +09:00
parent 8a0ae76334
commit f10437449f
5 changed files with 29 additions and 10 deletions

View File

@@ -867,8 +867,8 @@ class CallBuiltinFunction : Code
} }
override void execute(VM vm) override void execute(VM vm)
{ {
Value[] arg = vm.stack[vm.stacki - argcount..vm.stacki - 1]; Value[] arg = vm.stack[vm.stacki - argcount..vm.stacki];
Value[] result = vm.stack[vm.stacki - argcount..vm.stacki - argcount + outcount - 1];//雑; Value[] result = vm.stack[vm.stacki - argcount..vm.stacki - argcount + outcount];//雑;
func.func(vm.petitcomputer, arg, result); func.func(vm.petitcomputer, arg, result);
} }
} }

View File

@@ -50,11 +50,12 @@ class BuiltinFunction
} }
import std.math; import std.math;
/* /*
static pure double ABS(double a, double b) static pure double ABS(double a)
{ {
return a < 0 ? -a : a; return a < 0 ? -a : a;
}*/ }*/
static ABS = function(double x) => abs(x); static double function(double) ABS = &abs!double;
//static ABS = function double(double x) => abs(this.result == ValueType.Double ? 1 : 0);
static void LOCATE(PetitComputer p, DefaultValue!int x, DefaultValue!int y, DefaultValue!int z) static void LOCATE(PetitComputer p, DefaultValue!int x, DefaultValue!int y, DefaultValue!int z)
{ {
} }

View File

@@ -335,8 +335,16 @@ class Compiler
{ {
compileExpression(i, sc); compileExpression(i, sc);
} }
auto bfun = otya.smilebasic.builtinfunctions.BuiltinFunction.builtinFunctions.get(func.name, null);
if(bfun)
{
genCode(new CallBuiltinFunction(bfun, func.args.length, 1));
}
else
{
genCode(new CallFunctionCode(func.name, func.args.length)); genCode(new CallFunctionCode(func.name, func.args.length));
} }
}
break; break;
case NodeType.IndexExpressions://[expr,expr,expr,expr]用 case NodeType.IndexExpressions://[expr,expr,expr,expr]用
{ {
@@ -598,7 +606,15 @@ class Compiler
{ {
compileExpression(j, s); compileExpression(j, s);
} }
auto bfun = otya.smilebasic.builtinfunctions.BuiltinFunction.builtinFunctions.get(func.name, null);
if(bfun)
{
genCode(new CallBuiltinFunction(bfun, func.args.length, func.outVariable.length));
}
else
{
genCode(new CallFunctionCode(func.name, func.args.length, func.outVariable.length)); genCode(new CallFunctionCode(func.name, func.args.length, func.outVariable.length));
}
//TODO:OUT //TODO:OUT
foreach_reverse(wstring var; func.outVariable) foreach_reverse(wstring var; func.outVariable)
{ {

View File

@@ -13,7 +13,8 @@ int main(string[] argv)
writeln(parser.calc()); writeln(parser.calc());
} }
version(none)
{
auto parser = new Parser( auto parser = new Parser(
//"@A\nA=1+2+3+4\nPRINT 1+1,2+3;10-5,A:A=A*2 PRINT A //"@A\nA=1+2+3+4\nPRINT 1+1,2+3;10-5,A:A=A*2 PRINT A
" "
@@ -120,6 +121,7 @@ END
{ {
writeln(t); writeln(t);
} }
}
try try
{ {
auto pc = new PetitComputer(); auto pc = new PetitComputer();

View File

@@ -178,7 +178,7 @@ class PetitComputer
GRPF.createTexture(renderer); GRPF.createTexture(renderer);
//とりあえず //とりあえず
auto parser = new Parser(/*readText("FIZZBUZZ.TXT").to!wstring*/" auto parser = new Parser(/*readText("FIZZBUZZ.TXT").to!wstring*/"
?ABS(-1)
FOR I=0 TO 10 FOR I=0 TO 10
?I;\"!\",\"=\",FACT(I) ?I;\"!\",\"=\",FACT(I)
NEXT NEXT
@@ -209,7 +209,7 @@ END");
catch catch
{ {
} }
} }/*
catch(Throwable t) catch(Throwable t)
{ {
running = false; running = false;
@@ -220,7 +220,7 @@ END");
catch catch
{ {
} }
} }*/
elapse = SDL_GetTicks() - startTicks; elapse = SDL_GetTicks() - startTicks;
} while(elapse <= 1000 / 60); } while(elapse <= 1000 / 60);
SDL_Event event; SDL_Event event;