This commit is contained in:
blueloveTH 2023-09-30 12:12:27 +08:00
parent 24e6b162c8
commit 7774312209
2 changed files with 13 additions and 10 deletions

View File

@ -1,5 +1,5 @@
--- ---
icon: star icon: cpu
title: Write bindings title: Write bindings
order: 18 order: 18
--- ---
@ -8,6 +8,9 @@ order: 18
This document is working in progress. This document is working in progress.
!!! !!!
## Old documents (deprecated)
pkpy allows to wrap a function pointer as a python function or method that can be called in python code. pkpy allows to wrap a function pointer as a python function or method that can be called in python code.
This function pointer has the following signature: This function pointer has the following signature:
@ -19,7 +22,7 @@ typedef PyObject* (*NativeFuncC)(VM*, ArgsView);
+ The return value is a `PyObject*`, which should not be `nullptr`. If there is no return value, return `vm->None`. + The return value is a `PyObject*`, which should not be `nullptr`. If there is no return value, return `vm->None`.
## Bind a function or method ### Bind a function or method
Use `vm->bind` to bind a function or method. Use `vm->bind` to bind a function or method.
@ -44,7 +47,7 @@ vm->bind(obj,
}); });
``` ```
## Bind a property ### Bind a property
a property is a python's `property` that attached to a type instance with a getter and an optional setter. It is a data descriptor. A property redirects attribute access to specific functions. a property is a python's `property` that attached to a type instance with a getter and an optional setter. It is a data descriptor. A property redirects attribute access to specific functions.
@ -81,7 +84,7 @@ struct Point {
}; };
``` ```
## Others ### Others
You may see somewhere in the code that `vm->bind_method<>` or `vm->bind_func<>` is used. You may see somewhere in the code that `vm->bind_method<>` or `vm->bind_func<>` is used.
They are old style binding functions and are deprecated. They are old style binding functions and are deprecated.
@ -117,7 +120,7 @@ PY_CLASS(T, mod, name)
// name is the class name in python // name is the class name in python
``` ```
## Example ### Example
In this example, we will create a `linalg` module In this example, we will create a `linalg` module
and implement a `vec2` type with some methods. and implement a `vec2` type with some methods.
@ -141,7 +144,7 @@ print(a) # vec2(8.0, 2.0)
print(a.dot(b)) # -2.0 print(a.dot(b)) # -2.0
``` ```
### Implement `Vec2` struct in cpp #### Implement `Vec2` struct in cpp
```cpp ```cpp
struct Vec2{ struct Vec2{
@ -154,7 +157,7 @@ struct Vec2{
}; };
``` ```
### Create `PyVec2` wrapper #### Create `PyVec2` wrapper
```cpp ```cpp
struct PyVec2: Vec2 { struct PyVec2: Vec2 {
@ -193,7 +196,7 @@ struct PyVec2: Vec2 {
}; };
``` ```
### Create `linalg` module #### Create `linalg` module
```cpp ```cpp
void add_module_linalg(VM* vm){ void add_module_linalg(VM* vm){
@ -203,6 +206,6 @@ void add_module_linalg(VM* vm){
} }
``` ```
### Further reading #### Further reading
See [linalg.h](https://github.com/blueloveTH/pocketpy/blob/main/src/linalg.h) for the complete implementation. See [linalg.h](https://github.com/blueloveTH/pocketpy/blob/main/src/linalg.h) for the complete implementation.

View File

@ -1,3 +1,3 @@
icon: cpu icon: star
order: 16 order: 16
label: "Features" label: "Features"