|
|
@@ -0,0 +1,167 @@
|
|
|
+---
|
|
|
+icon: log
|
|
|
+title: 'Cheat Sheet'
|
|
|
+order: 22
|
|
|
+---
|
|
|
+
|
|
|
+## Basics
|
|
|
+
|
|
|
+Setup pocketpy
|
|
|
+
|
|
|
+```cpp
|
|
|
+#include "pocketpy.h"
|
|
|
+```
|
|
|
+
|
|
|
+Create a python virtual machine
|
|
|
+
|
|
|
+```cpp
|
|
|
+VM* vm = new VM();
|
|
|
+```
|
|
|
+
|
|
|
+Dispose a python virtual machine
|
|
|
+
|
|
|
+```cpp
|
|
|
+delete vm;
|
|
|
+```
|
|
|
+
|
|
|
+Execute a source string
|
|
|
+
|
|
|
+```cpp
|
|
|
+vm->exec("print('Hello!')");
|
|
|
+```
|
|
|
+
|
|
|
+Evaluate a source string
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* obj = vm->eval("123");
|
|
|
+std::cout << CAST(i64, obj); // 123
|
|
|
+```
|
|
|
+
|
|
|
+Compile a source string into a code object
|
|
|
+
|
|
|
+```cpp
|
|
|
+CodeObject_ co = vm->compile("print('Hello!')", "main.py", EXEC_MODE);
|
|
|
+```
|
|
|
+
|
|
|
+Execute a compiled code object
|
|
|
+
|
|
|
+```cpp
|
|
|
+try{
|
|
|
+ vm->_exec(co); // may throw
|
|
|
+}catch(Exception& e){
|
|
|
+ std::cerr << e.summary() << std::endl;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## Interop with native types
|
|
|
+
|
|
|
+Create primitive objects
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* obj;
|
|
|
+obj = VAR(1); // create a int
|
|
|
+obj = VAR(1.0); // create a float
|
|
|
+obj = VAR("123"); // create a string
|
|
|
+obj = VAR(true); // create a bool
|
|
|
+```
|
|
|
+
|
|
|
+Create a tuple object
|
|
|
+
|
|
|
+```cpp
|
|
|
+// obj = (1, 1.0, '123')
|
|
|
+Tuple t(3);
|
|
|
+t[0] = VAR(1);
|
|
|
+t[1] = VAR(1.0);
|
|
|
+t[2] = VAR("123");
|
|
|
+PyObject* obj = VAR(std::move(t));
|
|
|
+```
|
|
|
+
|
|
|
+Create a list object
|
|
|
+
|
|
|
+```cpp
|
|
|
+// obj = [1, 1.0, '123']
|
|
|
+List t;
|
|
|
+t.push_back(VAR(1));
|
|
|
+t.push_bask(VAR(1.0));
|
|
|
+t.push_back(VAR("123"));
|
|
|
+PyObject* obj = VAR(std::move(t));
|
|
|
+```
|
|
|
+
|
|
|
+Create a dict object
|
|
|
+
|
|
|
+```cpp
|
|
|
+// obj = {'x': 1, 'y': '123'}
|
|
|
+Dict d(vm);
|
|
|
+d.set(VAR('x'), VAR(1));
|
|
|
+d.set(VAR('y'), VAR('123'));
|
|
|
+PyObject* obj = VAR(std::move(d));
|
|
|
+```
|
|
|
+
|
|
|
+Get native types from python objects
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* obj;
|
|
|
+i64 a = CAST(i64, obj);
|
|
|
+f64 b = CAST(f64, obj);
|
|
|
+Str& c = CAST(Str&, obj); // reference cast
|
|
|
+bool d = CAST(bool, obj);
|
|
|
+
|
|
|
+Tuple& e = CAST(Tuple&, obj); // reference cast
|
|
|
+List& f = CAST(List&, obj); // reference cast
|
|
|
+Dict& g = CAST(Dict&, obj); // reference cast
|
|
|
+```
|
|
|
+
|
|
|
+## Access python types
|
|
|
+
|
|
|
+Access built-in python types
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* int_t = vm->_t(vm->tp_int);
|
|
|
+PyObject* float_t = vm->_t(vm->tp_float);
|
|
|
+PyObject* object_t = vm->_t(vm->tp_object);
|
|
|
+PyObject* tuple_t = vm->_t(vm->tp_tuple);
|
|
|
+PyObject* list_t = vm->_t(vm->tp_list);
|
|
|
+```
|
|
|
+
|
|
|
+Access extended python types
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* voidp_t = VoidP::_type(vm);
|
|
|
+```
|
|
|
+
|
|
|
+## Access attributes
|
|
|
+
|
|
|
+Check an object supports attribute access
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* obj;
|
|
|
+bool ok = !is_tagged(obj) && obj->is_attr_valid();
|
|
|
+```
|
|
|
+
|
|
|
+Get and set attributes
|
|
|
+
|
|
|
+```python
|
|
|
+class MyClass:
|
|
|
+ def __init__(self, x, y):
|
|
|
+ self.x = x
|
|
|
+ self.y = y
|
|
|
+```
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* obj = vm->exec("MyClass(1, 2)");
|
|
|
+PyObject* x = vm->getattr(obj, "x"); // obj.x
|
|
|
+vm->setattr(obj, "x", VAR(3)); // obj.x = 3
|
|
|
+```
|
|
|
+
|
|
|
+## Call python functions
|
|
|
+
|
|
|
+```python
|
|
|
+def add(a, b):
|
|
|
+ return a + b
|
|
|
+```
|
|
|
+
|
|
|
+```cpp
|
|
|
+PyObject* f_add = vm->eval("add");
|
|
|
+PyObject* ret = vm->call(f_add, VAR(1), VAR(2));
|
|
|
+std::cout << CAST(i64, ret); // 3
|
|
|
+```
|