blueloveTH %!s(int64=3) %!d(string=hai) anos
pai
achega
802e5f8b20
Modificáronse 8 ficheiros con 148 adicións e 4532 borrados
  1. 0 3
      amalgamate.py
  2. 47 1488
      plugins/flutter/src/pocketpy.h
  3. 1 1
      plugins/godot/godot-cpp
  4. 47 1488
      plugins/macos/pocketpy/pocketpy.h
  5. 0 57
      scripts/moc.py
  6. 0 1491
      src/_bindings.h
  7. 2 2
      src/main.cpp
  8. 51 2
      src/pocketpy.h

+ 0 - 3
amalgamate.py

@@ -1,7 +1,5 @@
 with open("src/opcodes.h", "rt", encoding='utf-8') as f:
 	OPCODES_TEXT = f.read()
-with open("src/_bindings.h", "rt", encoding='utf-8') as f:
-	_BINDINGS_TEXT = f.read()
 
 pipeline = [
 	["hash_table8.hpp", "common.h", "memory.h", "str.h", "safestl.h", "builtins.h", "error.h"],
@@ -32,7 +30,6 @@ def remove_copied_include(text):
 		text
 	)
 	text = text.replace('#include "opcodes.h"', OPCODES_TEXT)
-	text = text.replace('#include "_bindings.h"', _BINDINGS_TEXT)
 	return text
 
 for seq in pipeline:

+ 47 - 1488
plugins/flutter/src/pocketpy.h

@@ -6717,1498 +6717,57 @@ extern "C" {
         s_out->str(""); s_err->str("");
         return strdup(ss.str().c_str());
     }
-}
-
-extern "C" {
-typedef i64 (*__f_int__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_int__int_int_int(VM* vm, const char* mod, const char* name, __f_int__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_int__float_float_float(VM* vm, const char* mod, const char* name, __f_int__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_int__str_str_str(VM* vm, const char* mod, const char* name, __f_int__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_int__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_float__int_int_int(VM* vm, const char* mod, const char* name, __f_float__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_float__float_float_float(VM* vm, const char* mod, const char* name, __f_float__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_float__str_str_str(VM* vm, const char* mod, const char* name, __f_float__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_float__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_str__int_int_int(VM* vm, const char* mod, const char* name, __f_str__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_str__float_float_float(VM* vm, const char* mod, const char* name, __f_str__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_str__str_str_str(VM* vm, const char* mod, const char* name, __f_str__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_str__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__int_int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__float_float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str_str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_None__int_int_int(VM* vm, const char* mod, const char* name, __f_None__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_None__float_float_float(VM* vm, const char* mod, const char* name, __f_None__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_None__str_str_str(VM* vm, const char* mod, const char* name, __f_None__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_None__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_int__int_int(VM* vm, const char* mod, const char* name, __f_int__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_int__int_float(VM* vm, const char* mod, const char* name, __f_int__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_int__int_str(VM* vm, const char* mod, const char* name, __f_int__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_int__int_bool(VM* vm, const char* mod, const char* name, __f_int__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_int__float_int(VM* vm, const char* mod, const char* name, __f_int__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_int__float_float(VM* vm, const char* mod, const char* name, __f_int__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_int__float_str(VM* vm, const char* mod, const char* name, __f_int__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_int__float_bool(VM* vm, const char* mod, const char* name, __f_int__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_int__str_int(VM* vm, const char* mod, const char* name, __f_int__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_int__str_float(VM* vm, const char* mod, const char* name, __f_int__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_int__str_str(VM* vm, const char* mod, const char* name, __f_int__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_int__str_bool(VM* vm, const char* mod, const char* name, __f_int__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_int__bool_int(VM* vm, const char* mod, const char* name, __f_int__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_int__bool_float(VM* vm, const char* mod, const char* name, __f_int__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_int__bool_str(VM* vm, const char* mod, const char* name, __f_int__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_int__bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_float__int_int(VM* vm, const char* mod, const char* name, __f_float__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_float__int_float(VM* vm, const char* mod, const char* name, __f_float__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_float__int_str(VM* vm, const char* mod, const char* name, __f_float__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_float__int_bool(VM* vm, const char* mod, const char* name, __f_float__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_float__float_int(VM* vm, const char* mod, const char* name, __f_float__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_float__float_float(VM* vm, const char* mod, const char* name, __f_float__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_float__float_str(VM* vm, const char* mod, const char* name, __f_float__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_float__float_bool(VM* vm, const char* mod, const char* name, __f_float__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_float__str_int(VM* vm, const char* mod, const char* name, __f_float__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_float__str_float(VM* vm, const char* mod, const char* name, __f_float__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_float__str_str(VM* vm, const char* mod, const char* name, __f_float__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_float__str_bool(VM* vm, const char* mod, const char* name, __f_float__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_float__bool_int(VM* vm, const char* mod, const char* name, __f_float__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_float__bool_float(VM* vm, const char* mod, const char* name, __f_float__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_float__bool_str(VM* vm, const char* mod, const char* name, __f_float__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_float__bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_str__int_int(VM* vm, const char* mod, const char* name, __f_str__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_str__int_float(VM* vm, const char* mod, const char* name, __f_str__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_str__int_str(VM* vm, const char* mod, const char* name, __f_str__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_str__int_bool(VM* vm, const char* mod, const char* name, __f_str__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_str__float_int(VM* vm, const char* mod, const char* name, __f_str__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_str__float_float(VM* vm, const char* mod, const char* name, __f_str__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_str__float_str(VM* vm, const char* mod, const char* name, __f_str__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_str__float_bool(VM* vm, const char* mod, const char* name, __f_str__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_str__str_int(VM* vm, const char* mod, const char* name, __f_str__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_str__str_float(VM* vm, const char* mod, const char* name, __f_str__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_str__str_str(VM* vm, const char* mod, const char* name, __f_str__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_str__str_bool(VM* vm, const char* mod, const char* name, __f_str__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_str__bool_int(VM* vm, const char* mod, const char* name, __f_str__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_str__bool_float(VM* vm, const char* mod, const char* name, __f_str__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_str__bool_str(VM* vm, const char* mod, const char* name, __f_str__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_str__bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__int_float(VM* vm, const char* mod, const char* name, __f_bool__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__int_str(VM* vm, const char* mod, const char* name, __f_bool__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_bool__int_bool(VM* vm, const char* mod, const char* name, __f_bool__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__float_int(VM* vm, const char* mod, const char* name, __f_bool__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__float_str(VM* vm, const char* mod, const char* name, __f_bool__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_bool__float_bool(VM* vm, const char* mod, const char* name, __f_bool__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_bool__str_int(VM* vm, const char* mod, const char* name, __f_bool__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_bool__str_float(VM* vm, const char* mod, const char* name, __f_bool__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_bool__str_bool(VM* vm, const char* mod, const char* name, __f_bool__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_bool__bool_int(VM* vm, const char* mod, const char* name, __f_bool__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_bool__bool_float(VM* vm, const char* mod, const char* name, __f_bool__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__bool_str(VM* vm, const char* mod, const char* name, __f_bool__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_None__int_int(VM* vm, const char* mod, const char* name, __f_None__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_None__int_float(VM* vm, const char* mod, const char* name, __f_None__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_None__int_str(VM* vm, const char* mod, const char* name, __f_None__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
 
-typedef void (*__f_None__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_None__int_bool(VM* vm, const char* mod, const char* name, __f_None__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
+    typedef i64 (*f_int_t)(const char*);
+    typedef f64 (*f_float_t)(const char*);
+    typedef bool (*f_bool_t)(const char*);
+    typedef const char* (*f_str_t)(const char*);
+    typedef void (*f_None_t)(const char*);
 
-typedef void (*__f_None__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_None__float_int(VM* vm, const char* mod, const char* name, __f_None__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_None__float_float(VM* vm, const char* mod, const char* name, __f_None__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
+    static f_int_t f_int = nullptr;
+    static f_float_t f_float = nullptr;
+    static f_bool_t f_bool = nullptr;
+    static f_str_t f_str = nullptr;
+    static f_None_t f_None = nullptr;
 
-typedef void (*__f_None__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_None__float_str(VM* vm, const char* mod, const char* name, __f_None__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_None__float_bool(VM* vm, const char* mod, const char* name, __f_None__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_None__str_int(VM* vm, const char* mod, const char* name, __f_None__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_None__str_float(VM* vm, const char* mod, const char* name, __f_None__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_None__str_str(VM* vm, const char* mod, const char* name, __f_None__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_None__str_bool(VM* vm, const char* mod, const char* name, __f_None__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_None__bool_int(VM* vm, const char* mod, const char* name, __f_None__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_None__bool_float(VM* vm, const char* mod, const char* name, __f_None__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_None__bool_str(VM* vm, const char* mod, const char* name, __f_None__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_None__bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__int)(i64);
-__EXPORT
-void pkpy_vm_bind_int__int(VM* vm, const char* mod, const char* name, __f_int__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float)(f64);
-__EXPORT
-void pkpy_vm_bind_int__float(VM* vm, const char* mod, const char* name, __f_int__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_int__str(VM* vm, const char* mod, const char* name, __f_int__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_int__bool(VM* vm, const char* mod, const char* name, __f_int__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int)(i64);
-__EXPORT
-void pkpy_vm_bind_float__int(VM* vm, const char* mod, const char* name, __f_float__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float)(f64);
-__EXPORT
-void pkpy_vm_bind_float__float(VM* vm, const char* mod, const char* name, __f_float__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_float__str(VM* vm, const char* mod, const char* name, __f_float__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_float__bool(VM* vm, const char* mod, const char* name, __f_float__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int)(i64);
-__EXPORT
-void pkpy_vm_bind_str__int(VM* vm, const char* mod, const char* name, __f_str__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float)(f64);
-__EXPORT
-void pkpy_vm_bind_str__float(VM* vm, const char* mod, const char* name, __f_str__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_str__str(VM* vm, const char* mod, const char* name, __f_str__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_str__bool(VM* vm, const char* mod, const char* name, __f_str__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int)(i64);
-__EXPORT
-void pkpy_vm_bind_bool__int(VM* vm, const char* mod, const char* name, __f_bool__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float)(f64);
-__EXPORT
-void pkpy_vm_bind_bool__float(VM* vm, const char* mod, const char* name, __f_bool__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str(VM* vm, const char* mod, const char* name, __f_bool__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool(VM* vm, const char* mod, const char* name, __f_bool__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int)(i64);
-__EXPORT
-void pkpy_vm_bind_None__int(VM* vm, const char* mod, const char* name, __f_None__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float)(f64);
-__EXPORT
-void pkpy_vm_bind_None__float(VM* vm, const char* mod, const char* name, __f_None__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_None__str(VM* vm, const char* mod, const char* name, __f_None__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_None__bool(VM* vm, const char* mod, const char* name, __f_None__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__)();
-__EXPORT
-void pkpy_vm_bind_int__(VM* vm, const char* mod, const char* name, __f_int__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 ret = f();
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__)();
-__EXPORT
-void pkpy_vm_bind_float__(VM* vm, const char* mod, const char* name, __f_float__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 ret = f();
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__)();
-__EXPORT
-void pkpy_vm_bind_str__(VM* vm, const char* mod, const char* name, __f_str__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* ret = f();
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__)();
-__EXPORT
-void pkpy_vm_bind_bool__(VM* vm, const char* mod, const char* name, __f_bool__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool ret = f();
-        return vm->PyBool(ret);
-    });
-}
+    __EXPORT
+    /// Setup the callback functions.
+    void pkpy_setup_callbacks(f_int_t f_int, f_float_t f_float, f_bool_t f_bool, f_str_t f_str, f_None_t f_None){
+        ::f_int = f_int;
+        ::f_float = f_float;
+        ::f_bool = f_bool;
+        ::f_str = f_str;
+        ::f_None = f_None;
+    }
 
-typedef void (*__f_None__)();
-__EXPORT
-void pkpy_vm_bind_None__(VM* vm, const char* mod, const char* name, __f_None__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f();
-        return vm->None;
-    });
-}
+    __EXPORT
+    /// Bind a function to a virtual machine.
+    char* pkpy_vm_bind(VM* vm, const char* mod, const char* name, int ret_code){
+        if(!f_int || !f_float || !f_bool || !f_str || !f_None) return nullptr;
+        static int kGlobalBindId = 0;
+        for(int i=0; mod[i]; i++) if(mod[i] == ' ') return nullptr;
+        for(int i=0; name[i]; i++) if(name[i] == ' ') return nullptr;
+        std::string f_header = std::string(mod) + '.' + name + '#' + std::to_string(kGlobalBindId++);
+        PyVar obj = vm->new_module_if_not_existed(mod);
+        vm->bindFunc<-1>(obj, name, [ret_code, f_header](VM* vm, const pkpy::Args& args){
+            _StrStream ss;
+            ss << f_header << ' ';
+            for(int i=0; i<args.size(); i++){
+                PyVar x = vm->call(args[i], __json__);
+                ss << vm->PyStr_AS_C(x) << ' ';
+            }
+            switch(ret_code){
+                case 'i': return vm->PyInt(f_int(ss.str().c_str()));
+                case 'f': return vm->PyFloat(f_float(ss.str().c_str()));
+                case 'b': return vm->PyBool(f_bool(ss.str().c_str()));
+                case 's': return vm->PyStr(f_str(ss.str().c_str()));
+                case 'N': f_None(ss.str().c_str()); return vm->None;
+            }
+            UNREACHABLE();
+            return vm->None;
+        });
+        return strdup(f_header.c_str());
+    }
 }
 
 #endif // POCKETPY_H

+ 1 - 1
plugins/godot/godot-cpp

@@ -1 +1 @@
-Subproject commit 6df3b2fdfe9b1da642c18bfbd937b94541bf89bc
+Subproject commit 5a56f312c7e20d3356eaa0ac2711c1abd0da802c

+ 47 - 1488
plugins/macos/pocketpy/pocketpy.h

@@ -6717,1498 +6717,57 @@ extern "C" {
         s_out->str(""); s_err->str("");
         return strdup(ss.str().c_str());
     }
-}
-
-extern "C" {
-typedef i64 (*__f_int__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_int__int_int_int(VM* vm, const char* mod, const char* name, __f_int__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_int__float_float_float(VM* vm, const char* mod, const char* name, __f_int__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_int__str_str_str(VM* vm, const char* mod, const char* name, __f_int__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_int__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_float__int_int_int(VM* vm, const char* mod, const char* name, __f_float__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_float__float_float_float(VM* vm, const char* mod, const char* name, __f_float__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_float__str_str_str(VM* vm, const char* mod, const char* name, __f_float__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_float__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_str__int_int_int(VM* vm, const char* mod, const char* name, __f_str__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_str__float_float_float(VM* vm, const char* mod, const char* name, __f_str__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_str__str_str_str(VM* vm, const char* mod, const char* name, __f_str__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_str__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__int_int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__float_float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str_str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_None__int_int_int(VM* vm, const char* mod, const char* name, __f_None__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_None__float_float_float(VM* vm, const char* mod, const char* name, __f_None__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_None__str_str_str(VM* vm, const char* mod, const char* name, __f_None__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_None__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_int__int_int(VM* vm, const char* mod, const char* name, __f_int__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_int__int_float(VM* vm, const char* mod, const char* name, __f_int__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_int__int_str(VM* vm, const char* mod, const char* name, __f_int__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_int__int_bool(VM* vm, const char* mod, const char* name, __f_int__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_int__float_int(VM* vm, const char* mod, const char* name, __f_int__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_int__float_float(VM* vm, const char* mod, const char* name, __f_int__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_int__float_str(VM* vm, const char* mod, const char* name, __f_int__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_int__float_bool(VM* vm, const char* mod, const char* name, __f_int__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_int__str_int(VM* vm, const char* mod, const char* name, __f_int__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_int__str_float(VM* vm, const char* mod, const char* name, __f_int__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_int__str_str(VM* vm, const char* mod, const char* name, __f_int__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_int__str_bool(VM* vm, const char* mod, const char* name, __f_int__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_int__bool_int(VM* vm, const char* mod, const char* name, __f_int__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_int__bool_float(VM* vm, const char* mod, const char* name, __f_int__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_int__bool_str(VM* vm, const char* mod, const char* name, __f_int__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_int__bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_float__int_int(VM* vm, const char* mod, const char* name, __f_float__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_float__int_float(VM* vm, const char* mod, const char* name, __f_float__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_float__int_str(VM* vm, const char* mod, const char* name, __f_float__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_float__int_bool(VM* vm, const char* mod, const char* name, __f_float__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_float__float_int(VM* vm, const char* mod, const char* name, __f_float__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_float__float_float(VM* vm, const char* mod, const char* name, __f_float__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_float__float_str(VM* vm, const char* mod, const char* name, __f_float__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_float__float_bool(VM* vm, const char* mod, const char* name, __f_float__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_float__str_int(VM* vm, const char* mod, const char* name, __f_float__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_float__str_float(VM* vm, const char* mod, const char* name, __f_float__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_float__str_str(VM* vm, const char* mod, const char* name, __f_float__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_float__str_bool(VM* vm, const char* mod, const char* name, __f_float__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_float__bool_int(VM* vm, const char* mod, const char* name, __f_float__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_float__bool_float(VM* vm, const char* mod, const char* name, __f_float__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_float__bool_str(VM* vm, const char* mod, const char* name, __f_float__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_float__bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_str__int_int(VM* vm, const char* mod, const char* name, __f_str__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_str__int_float(VM* vm, const char* mod, const char* name, __f_str__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_str__int_str(VM* vm, const char* mod, const char* name, __f_str__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_str__int_bool(VM* vm, const char* mod, const char* name, __f_str__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_str__float_int(VM* vm, const char* mod, const char* name, __f_str__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_str__float_float(VM* vm, const char* mod, const char* name, __f_str__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_str__float_str(VM* vm, const char* mod, const char* name, __f_str__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_str__float_bool(VM* vm, const char* mod, const char* name, __f_str__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_str__str_int(VM* vm, const char* mod, const char* name, __f_str__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_str__str_float(VM* vm, const char* mod, const char* name, __f_str__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_str__str_str(VM* vm, const char* mod, const char* name, __f_str__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_str__str_bool(VM* vm, const char* mod, const char* name, __f_str__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_str__bool_int(VM* vm, const char* mod, const char* name, __f_str__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_str__bool_float(VM* vm, const char* mod, const char* name, __f_str__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_str__bool_str(VM* vm, const char* mod, const char* name, __f_str__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_str__bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__int_float(VM* vm, const char* mod, const char* name, __f_bool__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__int_str(VM* vm, const char* mod, const char* name, __f_bool__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_bool__int_bool(VM* vm, const char* mod, const char* name, __f_bool__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__float_int(VM* vm, const char* mod, const char* name, __f_bool__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__float_str(VM* vm, const char* mod, const char* name, __f_bool__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_bool__float_bool(VM* vm, const char* mod, const char* name, __f_bool__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_bool__str_int(VM* vm, const char* mod, const char* name, __f_bool__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_bool__str_float(VM* vm, const char* mod, const char* name, __f_bool__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_bool__str_bool(VM* vm, const char* mod, const char* name, __f_bool__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_bool__bool_int(VM* vm, const char* mod, const char* name, __f_bool__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_bool__bool_float(VM* vm, const char* mod, const char* name, __f_bool__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__bool_str(VM* vm, const char* mod, const char* name, __f_bool__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_None__int_int(VM* vm, const char* mod, const char* name, __f_None__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_None__int_float(VM* vm, const char* mod, const char* name, __f_None__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_None__int_str(VM* vm, const char* mod, const char* name, __f_None__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
 
-typedef void (*__f_None__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_None__int_bool(VM* vm, const char* mod, const char* name, __f_None__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
+    typedef i64 (*f_int_t)(const char*);
+    typedef f64 (*f_float_t)(const char*);
+    typedef bool (*f_bool_t)(const char*);
+    typedef const char* (*f_str_t)(const char*);
+    typedef void (*f_None_t)(const char*);
 
-typedef void (*__f_None__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_None__float_int(VM* vm, const char* mod, const char* name, __f_None__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_None__float_float(VM* vm, const char* mod, const char* name, __f_None__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
+    static f_int_t f_int = nullptr;
+    static f_float_t f_float = nullptr;
+    static f_bool_t f_bool = nullptr;
+    static f_str_t f_str = nullptr;
+    static f_None_t f_None = nullptr;
 
-typedef void (*__f_None__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_None__float_str(VM* vm, const char* mod, const char* name, __f_None__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_None__float_bool(VM* vm, const char* mod, const char* name, __f_None__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_None__str_int(VM* vm, const char* mod, const char* name, __f_None__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_None__str_float(VM* vm, const char* mod, const char* name, __f_None__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_None__str_str(VM* vm, const char* mod, const char* name, __f_None__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_None__str_bool(VM* vm, const char* mod, const char* name, __f_None__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_None__bool_int(VM* vm, const char* mod, const char* name, __f_None__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_None__bool_float(VM* vm, const char* mod, const char* name, __f_None__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_None__bool_str(VM* vm, const char* mod, const char* name, __f_None__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_None__bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__int)(i64);
-__EXPORT
-void pkpy_vm_bind_int__int(VM* vm, const char* mod, const char* name, __f_int__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float)(f64);
-__EXPORT
-void pkpy_vm_bind_int__float(VM* vm, const char* mod, const char* name, __f_int__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_int__str(VM* vm, const char* mod, const char* name, __f_int__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_int__bool(VM* vm, const char* mod, const char* name, __f_int__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int)(i64);
-__EXPORT
-void pkpy_vm_bind_float__int(VM* vm, const char* mod, const char* name, __f_float__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float)(f64);
-__EXPORT
-void pkpy_vm_bind_float__float(VM* vm, const char* mod, const char* name, __f_float__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_float__str(VM* vm, const char* mod, const char* name, __f_float__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_float__bool(VM* vm, const char* mod, const char* name, __f_float__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int)(i64);
-__EXPORT
-void pkpy_vm_bind_str__int(VM* vm, const char* mod, const char* name, __f_str__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float)(f64);
-__EXPORT
-void pkpy_vm_bind_str__float(VM* vm, const char* mod, const char* name, __f_str__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_str__str(VM* vm, const char* mod, const char* name, __f_str__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_str__bool(VM* vm, const char* mod, const char* name, __f_str__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int)(i64);
-__EXPORT
-void pkpy_vm_bind_bool__int(VM* vm, const char* mod, const char* name, __f_bool__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float)(f64);
-__EXPORT
-void pkpy_vm_bind_bool__float(VM* vm, const char* mod, const char* name, __f_bool__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str(VM* vm, const char* mod, const char* name, __f_bool__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool(VM* vm, const char* mod, const char* name, __f_bool__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int)(i64);
-__EXPORT
-void pkpy_vm_bind_None__int(VM* vm, const char* mod, const char* name, __f_None__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float)(f64);
-__EXPORT
-void pkpy_vm_bind_None__float(VM* vm, const char* mod, const char* name, __f_None__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_None__str(VM* vm, const char* mod, const char* name, __f_None__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_None__bool(VM* vm, const char* mod, const char* name, __f_None__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__)();
-__EXPORT
-void pkpy_vm_bind_int__(VM* vm, const char* mod, const char* name, __f_int__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 ret = f();
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__)();
-__EXPORT
-void pkpy_vm_bind_float__(VM* vm, const char* mod, const char* name, __f_float__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 ret = f();
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__)();
-__EXPORT
-void pkpy_vm_bind_str__(VM* vm, const char* mod, const char* name, __f_str__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* ret = f();
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__)();
-__EXPORT
-void pkpy_vm_bind_bool__(VM* vm, const char* mod, const char* name, __f_bool__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool ret = f();
-        return vm->PyBool(ret);
-    });
-}
+    __EXPORT
+    /// Setup the callback functions.
+    void pkpy_setup_callbacks(f_int_t f_int, f_float_t f_float, f_bool_t f_bool, f_str_t f_str, f_None_t f_None){
+        ::f_int = f_int;
+        ::f_float = f_float;
+        ::f_bool = f_bool;
+        ::f_str = f_str;
+        ::f_None = f_None;
+    }
 
-typedef void (*__f_None__)();
-__EXPORT
-void pkpy_vm_bind_None__(VM* vm, const char* mod, const char* name, __f_None__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f();
-        return vm->None;
-    });
-}
+    __EXPORT
+    /// Bind a function to a virtual machine.
+    char* pkpy_vm_bind(VM* vm, const char* mod, const char* name, int ret_code){
+        if(!f_int || !f_float || !f_bool || !f_str || !f_None) return nullptr;
+        static int kGlobalBindId = 0;
+        for(int i=0; mod[i]; i++) if(mod[i] == ' ') return nullptr;
+        for(int i=0; name[i]; i++) if(name[i] == ' ') return nullptr;
+        std::string f_header = std::string(mod) + '.' + name + '#' + std::to_string(kGlobalBindId++);
+        PyVar obj = vm->new_module_if_not_existed(mod);
+        vm->bindFunc<-1>(obj, name, [ret_code, f_header](VM* vm, const pkpy::Args& args){
+            _StrStream ss;
+            ss << f_header << ' ';
+            for(int i=0; i<args.size(); i++){
+                PyVar x = vm->call(args[i], __json__);
+                ss << vm->PyStr_AS_C(x) << ' ';
+            }
+            switch(ret_code){
+                case 'i': return vm->PyInt(f_int(ss.str().c_str()));
+                case 'f': return vm->PyFloat(f_float(ss.str().c_str()));
+                case 'b': return vm->PyBool(f_bool(ss.str().c_str()));
+                case 's': return vm->PyStr(f_str(ss.str().c_str()));
+                case 'N': f_None(ss.str().c_str()); return vm->None;
+            }
+            UNREACHABLE();
+            return vm->None;
+        });
+        return strdup(f_header.c_str());
+    }
 }
 
 #endif // POCKETPY_H

+ 0 - 57
scripts/moc.py

@@ -1,57 +0,0 @@
-mapping = {
-    'int': 'i64',
-    'float': 'f64',
-    'str': 'const char*',
-    'bool': 'bool',
-    'None': 'void'
-}
-
-def args(n, a: list, res: list, first=True):
-    if n == 0:
-        # 3 args must be the same type
-        if len(a) == 4 and len(set(a[1:])) != 1:
-            return
-        res.append(tuple(a))
-        return
-    for p_ret, c_ret in mapping.items():
-        if not first and p_ret == 'None':
-            continue
-        a.append(p_ret)
-        args(n-1, a, res, first=False)
-        a.pop()
-
-data = []
-for n in [4,3,2,1]:
-    res = []
-    args(n, [], res)
-    for p_ret,*p_args in res:
-        c_args = [mapping[i] for i in p_args]
-        c_ret = mapping[p_ret]
-        name = f'__f_{p_ret}__{"_".join(p_args)}'
-        # if c_ret == 'const char*':
-        #     c_ret = 'char*'
-        s = f'typedef {c_ret} (*{name})({", ".join(c_args)});'
-        s += '\n'
-
-        impl = []
-        for i, p_arg in enumerate(p_args):
-            impl.append( f'{mapping[p_arg]} _{i} = vm->Py{p_arg.capitalize()}_AS_C(args[{i}]);' )
-        call_impl = f'f({", ".join([f"_{j}" for j in range(len(p_args))])})';
-        if p_ret == 'None':
-            impl.append( call_impl + ';' )
-            impl.append( 'return vm->None;' )
-        else:
-            impl.append ( f'{mapping[p_ret]} ret = {call_impl};' )
-            impl.append( f'return vm->Py{p_ret.capitalize()}(ret);' )
-        impl = '\n'.join([' '*8 + i for i in impl])
-        s += f'''__EXPORT\nvoid pkpy_vm_bind{name[3:]}(VM* vm, const char* mod, const char* name, {name} f) {{
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<{len(p_args)}>(obj, name, [f](VM* vm, const pkpy::Args& args) {{
-{impl}
-    }});
-}}''' + '\n'
-        data.append(s)
-
-with open('src/_bindings.h', 'w') as f:
-    text = '\n'.join(data)
-    f.write('extern "C" {\n' + text + '}')

+ 0 - 1491
src/_bindings.h

@@ -1,1491 +0,0 @@
-extern "C" {
-typedef i64 (*__f_int__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_int__int_int_int(VM* vm, const char* mod, const char* name, __f_int__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_int__float_float_float(VM* vm, const char* mod, const char* name, __f_int__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_int__str_str_str(VM* vm, const char* mod, const char* name, __f_int__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_int__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        i64 ret = f(_0, _1, _2);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_float__int_int_int(VM* vm, const char* mod, const char* name, __f_float__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_float__float_float_float(VM* vm, const char* mod, const char* name, __f_float__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_float__str_str_str(VM* vm, const char* mod, const char* name, __f_float__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_float__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        f64 ret = f(_0, _1, _2);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_str__int_int_int(VM* vm, const char* mod, const char* name, __f_str__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_str__float_float_float(VM* vm, const char* mod, const char* name, __f_str__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_str__str_str_str(VM* vm, const char* mod, const char* name, __f_str__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_str__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        const char* ret = f(_0, _1, _2);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__int_int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__float_float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str_str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        bool ret = f(_0, _1, _2);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int_int_int)(i64, i64, i64);
-__EXPORT
-void pkpy_vm_bind_None__int_int_int(VM* vm, const char* mod, const char* name, __f_None__int_int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 _2 = vm->PyInt_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_float_float)(f64, f64, f64);
-__EXPORT
-void pkpy_vm_bind_None__float_float_float(VM* vm, const char* mod, const char* name, __f_None__float_float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 _2 = vm->PyFloat_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_str_str)(const char*, const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_None__str_str_str(VM* vm, const char* mod, const char* name, __f_None__str_str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* _2 = vm->PyStr_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_bool_bool)(bool, bool, bool);
-__EXPORT
-void pkpy_vm_bind_None__bool_bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<3>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool _2 = vm->PyBool_AS_C(args[2]);
-        f(_0, _1, _2);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_int__int_int(VM* vm, const char* mod, const char* name, __f_int__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_int__int_float(VM* vm, const char* mod, const char* name, __f_int__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_int__int_str(VM* vm, const char* mod, const char* name, __f_int__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_int__int_bool(VM* vm, const char* mod, const char* name, __f_int__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_int__float_int(VM* vm, const char* mod, const char* name, __f_int__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_int__float_float(VM* vm, const char* mod, const char* name, __f_int__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_int__float_str(VM* vm, const char* mod, const char* name, __f_int__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_int__float_bool(VM* vm, const char* mod, const char* name, __f_int__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_int__str_int(VM* vm, const char* mod, const char* name, __f_int__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_int__str_float(VM* vm, const char* mod, const char* name, __f_int__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_int__str_str(VM* vm, const char* mod, const char* name, __f_int__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_int__str_bool(VM* vm, const char* mod, const char* name, __f_int__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_int__bool_int(VM* vm, const char* mod, const char* name, __f_int__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_int__bool_float(VM* vm, const char* mod, const char* name, __f_int__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_int__bool_str(VM* vm, const char* mod, const char* name, __f_int__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_int__bool_bool(VM* vm, const char* mod, const char* name, __f_int__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        i64 ret = f(_0, _1);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_float__int_int(VM* vm, const char* mod, const char* name, __f_float__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_float__int_float(VM* vm, const char* mod, const char* name, __f_float__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_float__int_str(VM* vm, const char* mod, const char* name, __f_float__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_float__int_bool(VM* vm, const char* mod, const char* name, __f_float__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_float__float_int(VM* vm, const char* mod, const char* name, __f_float__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_float__float_float(VM* vm, const char* mod, const char* name, __f_float__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_float__float_str(VM* vm, const char* mod, const char* name, __f_float__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_float__float_bool(VM* vm, const char* mod, const char* name, __f_float__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_float__str_int(VM* vm, const char* mod, const char* name, __f_float__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_float__str_float(VM* vm, const char* mod, const char* name, __f_float__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_float__str_str(VM* vm, const char* mod, const char* name, __f_float__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_float__str_bool(VM* vm, const char* mod, const char* name, __f_float__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_float__bool_int(VM* vm, const char* mod, const char* name, __f_float__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_float__bool_float(VM* vm, const char* mod, const char* name, __f_float__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_float__bool_str(VM* vm, const char* mod, const char* name, __f_float__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_float__bool_bool(VM* vm, const char* mod, const char* name, __f_float__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f64 ret = f(_0, _1);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_str__int_int(VM* vm, const char* mod, const char* name, __f_str__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_str__int_float(VM* vm, const char* mod, const char* name, __f_str__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_str__int_str(VM* vm, const char* mod, const char* name, __f_str__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_str__int_bool(VM* vm, const char* mod, const char* name, __f_str__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_str__float_int(VM* vm, const char* mod, const char* name, __f_str__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_str__float_float(VM* vm, const char* mod, const char* name, __f_str__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_str__float_str(VM* vm, const char* mod, const char* name, __f_str__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_str__float_bool(VM* vm, const char* mod, const char* name, __f_str__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_str__str_int(VM* vm, const char* mod, const char* name, __f_str__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_str__str_float(VM* vm, const char* mod, const char* name, __f_str__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_str__str_str(VM* vm, const char* mod, const char* name, __f_str__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_str__str_bool(VM* vm, const char* mod, const char* name, __f_str__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_str__bool_int(VM* vm, const char* mod, const char* name, __f_str__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_str__bool_float(VM* vm, const char* mod, const char* name, __f_str__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_str__bool_str(VM* vm, const char* mod, const char* name, __f_str__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_str__bool_bool(VM* vm, const char* mod, const char* name, __f_str__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        const char* ret = f(_0, _1);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__int_int(VM* vm, const char* mod, const char* name, __f_bool__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__int_float(VM* vm, const char* mod, const char* name, __f_bool__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__int_str(VM* vm, const char* mod, const char* name, __f_bool__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_bool__int_bool(VM* vm, const char* mod, const char* name, __f_bool__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_bool__float_int(VM* vm, const char* mod, const char* name, __f_bool__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_bool__float_float(VM* vm, const char* mod, const char* name, __f_bool__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__float_str(VM* vm, const char* mod, const char* name, __f_bool__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_bool__float_bool(VM* vm, const char* mod, const char* name, __f_bool__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_bool__str_int(VM* vm, const char* mod, const char* name, __f_bool__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_bool__str_float(VM* vm, const char* mod, const char* name, __f_bool__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str_str(VM* vm, const char* mod, const char* name, __f_bool__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_bool__str_bool(VM* vm, const char* mod, const char* name, __f_bool__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_bool__bool_int(VM* vm, const char* mod, const char* name, __f_bool__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_bool__bool_float(VM* vm, const char* mod, const char* name, __f_bool__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_bool__bool_str(VM* vm, const char* mod, const char* name, __f_bool__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool_bool(VM* vm, const char* mod, const char* name, __f_bool__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        bool ret = f(_0, _1);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int_int)(i64, i64);
-__EXPORT
-void pkpy_vm_bind_None__int_int(VM* vm, const char* mod, const char* name, __f_None__int_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__int_float)(i64, f64);
-__EXPORT
-void pkpy_vm_bind_None__int_float(VM* vm, const char* mod, const char* name, __f_None__int_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__int_str)(i64, const char*);
-__EXPORT
-void pkpy_vm_bind_None__int_str(VM* vm, const char* mod, const char* name, __f_None__int_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__int_bool)(i64, bool);
-__EXPORT
-void pkpy_vm_bind_None__int_bool(VM* vm, const char* mod, const char* name, __f_None__int_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_int)(f64, i64);
-__EXPORT
-void pkpy_vm_bind_None__float_int(VM* vm, const char* mod, const char* name, __f_None__float_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_float)(f64, f64);
-__EXPORT
-void pkpy_vm_bind_None__float_float(VM* vm, const char* mod, const char* name, __f_None__float_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_str)(f64, const char*);
-__EXPORT
-void pkpy_vm_bind_None__float_str(VM* vm, const char* mod, const char* name, __f_None__float_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float_bool)(f64, bool);
-__EXPORT
-void pkpy_vm_bind_None__float_bool(VM* vm, const char* mod, const char* name, __f_None__float_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_int)(const char*, i64);
-__EXPORT
-void pkpy_vm_bind_None__str_int(VM* vm, const char* mod, const char* name, __f_None__str_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_float)(const char*, f64);
-__EXPORT
-void pkpy_vm_bind_None__str_float(VM* vm, const char* mod, const char* name, __f_None__str_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_str)(const char*, const char*);
-__EXPORT
-void pkpy_vm_bind_None__str_str(VM* vm, const char* mod, const char* name, __f_None__str_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str_bool)(const char*, bool);
-__EXPORT
-void pkpy_vm_bind_None__str_bool(VM* vm, const char* mod, const char* name, __f_None__str_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_int)(bool, i64);
-__EXPORT
-void pkpy_vm_bind_None__bool_int(VM* vm, const char* mod, const char* name, __f_None__bool_int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 _1 = vm->PyInt_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_float)(bool, f64);
-__EXPORT
-void pkpy_vm_bind_None__bool_float(VM* vm, const char* mod, const char* name, __f_None__bool_float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 _1 = vm->PyFloat_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_str)(bool, const char*);
-__EXPORT
-void pkpy_vm_bind_None__bool_str(VM* vm, const char* mod, const char* name, __f_None__bool_str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* _1 = vm->PyStr_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool_bool)(bool, bool);
-__EXPORT
-void pkpy_vm_bind_None__bool_bool(VM* vm, const char* mod, const char* name, __f_None__bool_bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<2>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool _1 = vm->PyBool_AS_C(args[1]);
-        f(_0, _1);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__int)(i64);
-__EXPORT
-void pkpy_vm_bind_int__int(VM* vm, const char* mod, const char* name, __f_int__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__float)(f64);
-__EXPORT
-void pkpy_vm_bind_int__float(VM* vm, const char* mod, const char* name, __f_int__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_int__str(VM* vm, const char* mod, const char* name, __f_int__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef i64 (*__f_int__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_int__bool(VM* vm, const char* mod, const char* name, __f_int__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        i64 ret = f(_0);
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__int)(i64);
-__EXPORT
-void pkpy_vm_bind_float__int(VM* vm, const char* mod, const char* name, __f_float__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__float)(f64);
-__EXPORT
-void pkpy_vm_bind_float__float(VM* vm, const char* mod, const char* name, __f_float__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_float__str(VM* vm, const char* mod, const char* name, __f_float__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef f64 (*__f_float__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_float__bool(VM* vm, const char* mod, const char* name, __f_float__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f64 ret = f(_0);
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__int)(i64);
-__EXPORT
-void pkpy_vm_bind_str__int(VM* vm, const char* mod, const char* name, __f_str__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__float)(f64);
-__EXPORT
-void pkpy_vm_bind_str__float(VM* vm, const char* mod, const char* name, __f_str__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_str__str(VM* vm, const char* mod, const char* name, __f_str__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef const char* (*__f_str__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_str__bool(VM* vm, const char* mod, const char* name, __f_str__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        const char* ret = f(_0);
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__int)(i64);
-__EXPORT
-void pkpy_vm_bind_bool__int(VM* vm, const char* mod, const char* name, __f_bool__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__float)(f64);
-__EXPORT
-void pkpy_vm_bind_bool__float(VM* vm, const char* mod, const char* name, __f_bool__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_bool__str(VM* vm, const char* mod, const char* name, __f_bool__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef bool (*__f_bool__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_bool__bool(VM* vm, const char* mod, const char* name, __f_bool__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        bool ret = f(_0);
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__int)(i64);
-__EXPORT
-void pkpy_vm_bind_None__int(VM* vm, const char* mod, const char* name, __f_None__int f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 _0 = vm->PyInt_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__float)(f64);
-__EXPORT
-void pkpy_vm_bind_None__float(VM* vm, const char* mod, const char* name, __f_None__float f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 _0 = vm->PyFloat_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__str)(const char*);
-__EXPORT
-void pkpy_vm_bind_None__str(VM* vm, const char* mod, const char* name, __f_None__str f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* _0 = vm->PyStr_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef void (*__f_None__bool)(bool);
-__EXPORT
-void pkpy_vm_bind_None__bool(VM* vm, const char* mod, const char* name, __f_None__bool f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<1>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool _0 = vm->PyBool_AS_C(args[0]);
-        f(_0);
-        return vm->None;
-    });
-}
-
-typedef i64 (*__f_int__)();
-__EXPORT
-void pkpy_vm_bind_int__(VM* vm, const char* mod, const char* name, __f_int__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        i64 ret = f();
-        return vm->PyInt(ret);
-    });
-}
-
-typedef f64 (*__f_float__)();
-__EXPORT
-void pkpy_vm_bind_float__(VM* vm, const char* mod, const char* name, __f_float__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f64 ret = f();
-        return vm->PyFloat(ret);
-    });
-}
-
-typedef const char* (*__f_str__)();
-__EXPORT
-void pkpy_vm_bind_str__(VM* vm, const char* mod, const char* name, __f_str__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        const char* ret = f();
-        return vm->PyStr(ret);
-    });
-}
-
-typedef bool (*__f_bool__)();
-__EXPORT
-void pkpy_vm_bind_bool__(VM* vm, const char* mod, const char* name, __f_bool__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        bool ret = f();
-        return vm->PyBool(ret);
-    });
-}
-
-typedef void (*__f_None__)();
-__EXPORT
-void pkpy_vm_bind_None__(VM* vm, const char* mod, const char* name, __f_None__ f) {
-    PyVar obj = vm->new_module_if_not_existed(mod);
-    vm->bindFunc<0>(obj, name, [f](VM* vm, const pkpy::Args& args) {
-        f();
-        return vm->None;
-    });
-}
-}

+ 2 - 2
src/main.cpp

@@ -19,10 +19,10 @@ struct Timer{
 
 int main(int argc, char** argv){
     VM* vm = pkpy_new_vm(true);
-    pkpy_vm_bind_str__(vm, "builtins", "input", [](){
+    vm->bindBuiltinFunc<0>("input", [](VM* vm, const pkpy::Args& args){
         static std::string line;
         std::getline(std::cin, line);
-        return line.c_str();
+        return vm->PyStr(line);
     });
     if(argc == 1){
         REPL* repl = pkpy_new_repl(vm);

+ 51 - 2
src/pocketpy.h

@@ -792,6 +792,55 @@ extern "C" {
         s_out->str(""); s_err->str("");
         return strdup(ss.str().c_str());
     }
-}
 
-#include "_bindings.h"
+    typedef i64 (*f_int_t)(const char*);
+    typedef f64 (*f_float_t)(const char*);
+    typedef bool (*f_bool_t)(const char*);
+    typedef const char* (*f_str_t)(const char*);
+    typedef void (*f_None_t)(const char*);
+
+    static f_int_t f_int = nullptr;
+    static f_float_t f_float = nullptr;
+    static f_bool_t f_bool = nullptr;
+    static f_str_t f_str = nullptr;
+    static f_None_t f_None = nullptr;
+
+    __EXPORT
+    /// Setup the callback functions.
+    void pkpy_setup_callbacks(f_int_t f_int, f_float_t f_float, f_bool_t f_bool, f_str_t f_str, f_None_t f_None){
+        ::f_int = f_int;
+        ::f_float = f_float;
+        ::f_bool = f_bool;
+        ::f_str = f_str;
+        ::f_None = f_None;
+    }
+
+    __EXPORT
+    /// Bind a function to a virtual machine.
+    char* pkpy_vm_bind(VM* vm, const char* mod, const char* name, int ret_code){
+        if(!f_int || !f_float || !f_bool || !f_str || !f_None) return nullptr;
+        static int kGlobalBindId = 0;
+        for(int i=0; mod[i]; i++) if(mod[i] == ' ') return nullptr;
+        for(int i=0; name[i]; i++) if(name[i] == ' ') return nullptr;
+        std::string f_header = std::string(mod) + '.' + name + '#' + std::to_string(kGlobalBindId++);
+        PyVar obj = vm->new_module_if_not_existed(mod);
+        vm->bindFunc<-1>(obj, name, [ret_code, f_header](VM* vm, const pkpy::Args& args){
+            _StrStream ss;
+            ss << f_header << ' ';
+            for(int i=0; i<args.size(); i++){
+                PyVar x = vm->call(args[i], __json__);
+                ss << vm->PyStr_AS_C(x) << ' ';
+            }
+            switch(ret_code){
+                case 'i': return vm->PyInt(f_int(ss.str().c_str()));
+                case 'f': return vm->PyFloat(f_float(ss.str().c_str()));
+                case 'b': return vm->PyBool(f_bool(ss.str().c_str()));
+                case 's': return vm->PyStr(f_str(ss.str().c_str()));
+                case 'N': f_None(ss.str().c_str()); return vm->None;
+            }
+            UNREACHABLE();
+            return vm->None;
+        });
+        return strdup(f_header.c_str());
+    }
+}