modulo alternatives and similar packages
Based on the "FFI" category.
Alternatively, view modulo alternatives based on common mentions on social networks and blogs.
-
inline-java
Haskell/Java interop via inline Java code in Haskell modules. -
inline-c
Write Haskell source files including C code inline. No FFI required. -
bindings-lxc
Direct Haskell bindings to LXC (Linux containers) C API. -
statgrab
Haskell bindings to the portable system statistics libstatgrab library. -
bindings-levmar
Low level Haskell bindings to the C levmar (Levenberg-Marquardt) library -
bindings-gobject
Low level binding supporting GObject and derived libraries -
storable-static-array
Statically-sized array wrappers with Storable instances for FFI marshaling -
fixed-storable-array
fixed-size StorableArray wrapper with its own Storable instance -
bindings-sc3
Haskell bindings to the SuperCollider synthesis engine
Access the most powerful time series database as a service
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of modulo or a related project?
README
Modulo
Modulo is a tool that generates modular, standard C interfaces based on a high-level description language. The idea is to specify functionality in the module language and implement it in any language that supports C-style calling conventions.
This package include generators for C, JavaScript, Haskell and Common Lisp.
Requirements
Installation
cabal configure
cabal install
Usage
Usage: modulo [options]
Usage: modulo [options] files...
Languages:
C
Lisp
JavaScript
Haskell
Options:
-h --help Print help and exit
-v --version Print version and exit
-L[LANG] --language[=LANG] Output language
-M[PATH] --module-path[=PATH] Module paths
Module language
Overview
Pointer a*
Array [a x N]
Function (a, b) -> c
Struct struct { a: A, b: B }
Union union { a: A, b: B }
Tagged union data { a: A, b: B }
Enum enum { a, b, c }
Alias b
Description
The module language is very simple. Each module consists of a name followed by eventual import declarations, followed by all other declarations. Here is an example module:
module List
{
opaque Elem;
opaque List;
nil : () -> List;
cons : (Elem, List) -> List;
head : (List) -> Elem;
tail : (List) -> List;
empty : (List) -> Bool;
lenght : (List) -> Int;
reverse : (List) -> List;
sort : (List) -> List;
}
Like C, the module language uses structural typing for pointers and functions, but
nominal typing for structures and unions. Thus in the following example values of type
A
and B
are interchangeable, but values of type C
and D
are not.
type A = Int*
type B = Int*
type C = struct { x : Int, y : Int }
type D = struct { x : Int, y : Int }
The pointer type constructor can be used with any type:
type IntPtr = Int*
type FloatPtr = Float*
The array type constructor need an explicit length:
type IntVec = [Int x 10]
Functions are written as in Haskell, except for the parentheses enclosing the arguments. Thus, higher-arity functions are easily distinguished.
type NoCurry = (A, B) -> C
type Curry = (A) -> (B) -> C
Compound types are written in a uniform manner:
type IntCounter = struct { a : Int, b : Int -> Int }
type NumValue = union { left : Int, right : Float }
type Color = enum { Red, Green, Blue }
The following primitive types are provided:
Void Size Ptrdiff Intptr UIntptr
Char Short Int Long LongLong
UChar UShort UInt ULong ULongLong
Float Double LongDouble
Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64