|
|
@@ -92,41 +92,63 @@ python scripts/run_tests.py
|
|
|
|
|
|
### Example
|
|
|
|
|
|
-```cpp
|
|
|
+```c
|
|
|
#include "pocketpy.h"
|
|
|
+#include <stdio.h>
|
|
|
+
|
|
|
+static bool int_add(int argc, py_Ref argv) {
|
|
|
+ PY_CHECK_ARGC(2);
|
|
|
+ PY_CHECK_ARG_TYPE(0, tp_int);
|
|
|
+ PY_CHECK_ARG_TYPE(1, tp_int);
|
|
|
+ py_i64 a = py_toint(py_arg(0));
|
|
|
+ py_i64 b = py_toint(py_arg(1));
|
|
|
+ py_newint(py_retval(), a + b);
|
|
|
+ return true;
|
|
|
+}
|
|
|
|
|
|
-using namespace pkpy;
|
|
|
-
|
|
|
-int main(){
|
|
|
- // Create a virtual machine
|
|
|
- VM* vm = new VM();
|
|
|
+int main() {
|
|
|
+ // Initialize pocketpy
|
|
|
+ py_initialize();
|
|
|
|
|
|
// Hello world!
|
|
|
- vm->exec("print('Hello world!')");
|
|
|
+ bool ok = py_exec("print('Hello world!')", "<string>", EXEC_MODE, NULL);
|
|
|
+ if(!ok) goto __ERROR;
|
|
|
|
|
|
- // Create a list
|
|
|
- vm->exec("a = [1, 2, 3]");
|
|
|
+ // Create a list: [1, 2, 3]
|
|
|
+ py_Ref r0 = py_getreg(0);
|
|
|
+ py_newlistn(r0, 3);
|
|
|
+ py_newint(py_list_getitem(r0, 0), 1);
|
|
|
+ py_newint(py_list_getitem(r0, 1), 2);
|
|
|
+ py_newint(py_list_getitem(r0, 2), 3);
|
|
|
|
|
|
// Eval the sum of the list
|
|
|
- PyVar result = vm->eval("sum(a)");
|
|
|
- std::cout << "Sum of the list: "<< py_cast<int>(vm, result) << std::endl; // 6
|
|
|
-
|
|
|
- // Bindings
|
|
|
- vm->bind(vm->_main, "add(a: int, b: int)",
|
|
|
- [](VM* vm, ArgsView args){
|
|
|
- int a = py_cast<int>(vm, args[0]);
|
|
|
- int b = py_cast<int>(vm, args[1]);
|
|
|
- return py_var(vm, a + b);
|
|
|
- });
|
|
|
-
|
|
|
- // Call the function
|
|
|
- PyVar f_add = vm->_main->attr("add");
|
|
|
- result = vm->call(f_add, py_var(vm, 3), py_var(vm, 7));
|
|
|
- std::cout << "Sum of 2 variables: "<< py_cast<int>(vm, result) << std::endl; // 10
|
|
|
-
|
|
|
- // Dispose the virtual machine
|
|
|
- delete vm;
|
|
|
+ py_Ref f_sum = py_getbuiltin(py_name("sum"));
|
|
|
+ py_push(f_sum);
|
|
|
+ py_pushnil();
|
|
|
+ py_push(r0);
|
|
|
+ ok = py_vectorcall(1, 0);
|
|
|
+ if(!ok) goto __ERROR;
|
|
|
+
|
|
|
+ printf("Sum of the list: %d\n", (int)py_toint(py_retval())); // 6
|
|
|
+
|
|
|
+ // Bind native `int_add` as a global variable
|
|
|
+ py_newnativefunc(r0, int_add);
|
|
|
+ py_setglobal(py_name("add"), r0);
|
|
|
+
|
|
|
+ // Call `add` in python
|
|
|
+ ok = py_exec("add(3, 7)", "<string>", EVAL_MODE, NULL);
|
|
|
+ if(!ok) goto __ERROR;
|
|
|
+
|
|
|
+ py_i64 res = py_toint(py_retval());
|
|
|
+ printf("Sum of 2 variables: %d\n", (int)res); // 10
|
|
|
+
|
|
|
+ py_finalize();
|
|
|
return 0;
|
|
|
+
|
|
|
+__ERROR:
|
|
|
+ py_printexc();
|
|
|
+ py_finalize();
|
|
|
+ return 1;
|
|
|
}
|
|
|
```
|
|
|
|