blueloveTH hace 3 años
padre
commit
b35e46265b
Se han modificado 4 ficheros con 58 adiciones y 2 borrados
  1. 2 0
      src/compiler.h
  2. 2 2
      src/main.cpp
  3. 44 0
      src/pocketpy.h
  4. 10 0
      tests/math.py

+ 2 - 0
src/compiler.h

@@ -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();
     }
     }
 
 

+ 2 - 2
src/main.cpp

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

+ 44 - 0
src/pocketpy.h

@@ -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 - 0
tests/math.py

@@ -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)