c2ats alternatives and similar packages
Based on the "Language" category.
Alternatively, view c2ats alternatives based on common mentions on social networks and blogs.
-
stylish-haskell
DISCONTINUED. Haskell code prettifier [Moved to: https://github.com/haskell/stylish-haskell] -
ministg
Ministg is an interpreter for a high-level, small-step, operational semantics for the STG machine.
CodeRabbit: AI Code Reviews for Developers
* 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 c2ats or a related project?
README
c2ats - generate ATS interface from C code
What's this?
ATS is a statically typed programming language that unifies implementation with formal specification. It can powerfully capture invariant in program.
However, don't you feel frustration to use API of many C language libraries from ATS code? Don't you manually import such API into ATS code?
The c2ats is an utility to generate ATS's sats file importing from C language header, semi-automatically.
Requirements
- GCC to parse C language header
- Haskell Platform to build Haskell code
- ATS to compile ATS code generated by c2ats
We are testing this tool on Debian GNU/Linux.
Install
Checkout source code of the c2ats:
$ git clone https://github.com/metasepi/c2ats.git
$ cd c2ats
Then install it using stack:
$ cabal update
$ cabal install
$ which c2ats
/home/YourName/.cabal/bin/c2ats
Usage
Start from [Hello World example](./example/hello). Create following fake C language header to use printf(3)
function in C language:
$ vi example.h
#include <stdio.h>
Next, let the c2ats to generate ATS sats file from above header:
$ c2ats gen example.h > example.sats
$ wc -l example.sats
318 example.sats
$ grep _printf example.sats
fun fun_c2ats_printf: {l1:addr} (!ptr_v_1(char, l1) | ptr l1) -> int = "mac#printf"
The sats file has many ATS declarations generated from the C header. It includes a declaration of printf(3)
which can be used as following in dats:
$ vi main.dats
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
staload UN = "prelude/SATS/unsafe.sats"
staload "example.sats"
fun my_printf (s: string): void = {
val p = string2ptr s
val (pfat, fpfat | p) = $UN.ptr_vtake p
val ret = fun_c2ats_printf (pfat | p)
prval () = fpfat pfat
}
implement main0 () = {
val s = "Hello, world!\n"
val () = my_printf s
}
$ patscc main.dats
$ ./a.out
Hello, world!
Of course, above code is so messy. It's caused by assigning a bad signature to fun_c2ats_printf
function. You can get better dats code, if modify sats file as following:
$ vi example.sats
--snip--
fun fun_c2ats_printf: (string) -> int = "mac#printf"
--snip--
$ vi main.dats
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
staload UN = "prelude/SATS/unsafe.sats"
staload "example.sats"
implement main0 () = {
val s = "Hello, world!\n"
val _ = fun_c2ats_printf s
}
$ patscc main.dats
$ ./a.out
Hello, world!
Totally, the c2ats generates a scaffold (you may be familiar with Ruby on Rails) to build ATS application. Sometimes, it's useful to create application rapidly. However, such scaffold should be replaced with better signature until shipping your product.
The other examples are found at [example](./example/) directory.
See also
License
GPLv3 or later.
Copyright (c) 2016 Metasepi Team.
*Note that all licence references and agreements mentioned in the c2ats README section above
are relevant to that project's source code only.