fix a bug

This commit is contained in:
blueloveTH 2022-12-05 19:28:29 +08:00
parent 040ef62d51
commit b35e46265b
4 changed files with 58 additions and 2 deletions

View File

@ -683,6 +683,7 @@ __LISTCOMP:
Token tkmodule = compileImportPath(); Token tkmodule = compileImportPath();
consume(TK("import")); consume(TK("import"));
do { do {
emitCode(OP_DUP_TOP);
consume(TK("@id")); consume(TK("@id"));
Token tkname = parser->previous; Token tkname = parser->previous;
int index = getCode()->addName(tkname.str(), NAME_GLOBAL); int index = getCode()->addName(tkname.str(), NAME_GLOBAL);
@ -694,6 +695,7 @@ __LISTCOMP:
index = getCode()->addName(tkname.str(), NAME_GLOBAL); index = getCode()->addName(tkname.str(), NAME_GLOBAL);
emitCode(OP_STORE_NAME_PTR, index); emitCode(OP_STORE_NAME_PTR, index);
} while (match(TK(","))); } while (match(TK(",")));
emitCode(OP_POP_TOP);
consumeEndStatement(); consumeEndStatement();
} }

View File

@ -3,8 +3,8 @@
#include "pocketpy.h" #include "pocketpy.h"
#define PK_DEBUG_TIME //#define PK_DEBUG_TIME
//#define PK_DEBUG_THREADED #define PK_DEBUG_THREADED
struct Timer{ struct Timer{
const char* title; const char* title;

View File

@ -648,6 +648,49 @@ void __addModuleJson(VM* vm){
}); });
} }
void __addModuleMath(VM* vm){
PyVar mod = vm->newModule("math");
vm->setAttr(mod, "pi", vm->PyFloat(M_PI));
vm->setAttr(mod, "e", vm->PyFloat(M_E));
vm->bindFunc(mod, "log", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(log(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "log10", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(log10(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "log2", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(log2(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "sin", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(sin(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "cos", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(cos(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "tan", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 1);
return vm->PyFloat(tan(vm->numToFloat(args[0])));
});
vm->bindFunc(mod, "isclose", [](VM* vm, const pkpy::ArgList& args) {
vm->__checkArgSize(args, 2);
_Float a = vm->numToFloat(args[0]);
_Float b = vm->numToFloat(args[1]);
return vm->PyBool(fabs(a - b) < 1e-6);
});
}
class _PkExported{ class _PkExported{
public: public:
virtual ~_PkExported() = default; virtual ~_PkExported() = default;
@ -764,6 +807,7 @@ extern "C" {
__addModuleSys(vm); __addModuleSys(vm);
__addModuleTime(vm); __addModuleTime(vm);
__addModuleJson(vm); __addModuleJson(vm);
__addModuleMath(vm);
_Code code = compile(vm, __BUILTINS_CODE, "<builtins>"); _Code code = compile(vm, __BUILTINS_CODE, "<builtins>");
if(code == nullptr) exit(1); if(code == nullptr) exit(1);

10
tests/math.py Normal file
View File

@ -0,0 +1,10 @@
from math import log, log10, log2, sin, cos, tan, e, pi, isclose
assert isclose(e, 2.718281828459045)
assert isclose(pi, 3.141592653589793)
assert isclose(log(10), 2.302585092994046)
assert isclose(log10(10), 1.0)
assert isclose(log2(10), 3.321928094887362)
assert isclose(sin(0), 0.0)
assert isclose(cos(0), 1.0)
assert isclose(tan(0), 0.0)