Foreign language interop

Wrapping C

Using shared library

Example: secp256k1

https://github.com/status-im/nim-secp256k1/blob/master/secp256k1_abi.nim

Compiling directly the C files

Example: Apache Milagro Crypto

https://github.com/status-im/nim-blscurve/blob/master/blscurve/milagro.nim

Wrapping C++

Beyond the syntax for wrapping C, Nim offers a flexible syntax for wrapping C++, for example for vectors:

type
  CppVector* {.importcpp"std::vector", header: "<vector>", byref.} [T] = object

proc newCppVector*[T](): CppVector[T] {.importcpp: "std::vector<'*0>()", header: "<vector>", constructor.}
proc newCppVector*[T](size: int): CppVector[T] {.importcpp: "std::vector<'*0>(#)", header: "<vector>", constructor.}
proc len*(v: CppVector): int {.importcpp: "#.size()", header: "<vector>".}
proc add*[T](v: var CppVector[T], elem: T){.importcpp: "#.push_back(#)", header: "<vector>".}
proc `[]`*[T](v: CppVector[T], idx: int): T{.importcpp: "#[#]", header: "<vector>".}
proc `[]`*[T](v: var CppVector[T], idx: int): var T{.importcpp: "#[#]", header: "<vector>".}
proc `[]=`*[T](v: var CppVector[T], idx: int, value: T) {.importcpp: "#[#]=#", header: "<vector>".}

Example: ttmath

https://github.com/status-im/nim-ttmath/blob/master/src/ttmath.nim

Exporting

See "Fuzzing" chapter for exporting a C API for fuzzing

References