41 lines
1.4 KiB
C
41 lines
1.4 KiB
C
|
/* This example demonstrates the following features in a native module:
|
||
|
- defining a simple function exposed to Python
|
||
|
- defining a local, helper C function
|
||
|
- getting and creating integer objects
|
||
|
*/
|
||
|
|
||
|
// Include the header file to get access to the MicroPython API
|
||
|
#include "py/dynruntime.h"
|
||
|
|
||
|
// Helper function to compute factorial
|
||
|
STATIC mp_int_t factorial_helper(mp_int_t x) {
|
||
|
if (x == 0) {
|
||
|
return 1;
|
||
|
}
|
||
|
return x * factorial_helper(x - 1);
|
||
|
}
|
||
|
|
||
|
// This is the function which will be called from Python, as factorial(x)
|
||
|
STATIC mp_obj_t factorial(mp_obj_t x_obj) {
|
||
|
// Extract the integer from the MicroPython input object
|
||
|
mp_int_t x = mp_obj_get_int(x_obj);
|
||
|
// Calculate the factorial
|
||
|
mp_int_t result = factorial_helper(x);
|
||
|
// Convert the result to a MicroPython integer object and return it
|
||
|
return mp_obj_new_int(result);
|
||
|
}
|
||
|
// Define a Python reference to the function above
|
||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(factorial_obj, factorial);
|
||
|
|
||
|
// This is the entry point and is called when the module is imported
|
||
|
mp_obj_t mpy_init(mp_obj_fun_bc_t *self, size_t n_args, size_t n_kw, mp_obj_t *args) {
|
||
|
// This must be first, it sets up the globals dict and other things
|
||
|
MP_DYNRUNTIME_INIT_ENTRY
|
||
|
|
||
|
// Make the function available in the module's namespace
|
||
|
mp_store_global(MP_QSTR_factorial, MP_OBJ_FROM_PTR(&factorial_obj));
|
||
|
|
||
|
// This must be last, it restores the globals dict
|
||
|
MP_DYNRUNTIME_INIT_EXIT
|
||
|
}
|