-------------------
High-level bindings
-------------------
The quickest way to learn how to use the bindings is to browse the tests.

* first, import the high-level python bindings into your module:

  import nimborg/py/high_level

* all nimrod-accessible python objects are wrapped with a reference of
type PPyRef.

* import python modules with a statement such as:

  let py_math = pyImport("math")

thus imported, the module is a regular python object.

* evaluate python expressions with eval(), see python/test/test_py_eval.nim

* the operations supported on python objects are:
- member access in the form a.b
- subscripted access and assignment, e.g.: person["age"] = person["age"]+1
- basic arithmetic (+, -, *, /, %)
- conversion to string with `$`
- len, repr
- create python lists with pyList()
- create python dicts with pyDict()

* fast read/write access to the contents of numpy array, via the functions 
float32Buffer, float64Buffer, and uint8Buffer (other such functions should
be easy to add).

-------------------
Low-level bindings
-------------------
The low-level bindings are a copy of the bindings by Andreas Rumpf, with very small modifications.
See the python/C API documentation.
