1391 lines
65 KiB
HTML
1391 lines
65 KiB
HTML
<h1 id="awesome-ocaml">Awesome OCaml</h1>
|
||
<p><img src="colour-logo.png" width="70%" /></p>
|
||
<blockquote>
|
||
<p><em><strong>Everything you’ll ever need on the road to mastering
|
||
OCaml.</strong></em></p>
|
||
</blockquote>
|
||
<p>A curated list of references to awesome OCaml tools, frameworks,
|
||
libraries, and articles. Additionally, there is a collection of freely
|
||
available <a
|
||
href="https://github.com/rizo/awesome-ocaml/tree/master/books"><strong>books</strong></a>,
|
||
<a
|
||
href="https://github.com/rizo/awesome-ocaml/tree/master/papers"><strong>papers</strong></a>,
|
||
and <a
|
||
href="https://github.com/rizo/awesome-ocaml/tree/master/presentations"><strong>presentations</strong></a>.</p>
|
||
<p>If you’re looking for comprehensive community-driven content about
|
||
OCaml, visit 📚<a
|
||
href="https://ocamlverse.github.io/">OCamlverse</a>!</p>
|
||
<p>For a quick introduction to the modern OCaml development workflow,
|
||
consult the <a
|
||
href="https://ocaml.org/learn/tutorials/up_and_running.html"><strong>Up
|
||
and Running with OCaml</strong></a> tutorial.</p>
|
||
<p>Your favorite package is not listed? Fork and <a
|
||
href="https://github.com/rizo/awesome-ocaml/edit/master/README.md">create
|
||
a Pull Request</a> to add it!</p>
|
||
<h2 id="contents">Contents</h2>
|
||
<ul>
|
||
<li><a href="#community">Community</a></li>
|
||
<li><a href="#algorithms-and-data-structures">Algorithms and Data
|
||
Structures</a></li>
|
||
<li><a href="#application-libraries">Application Libraries</a></li>
|
||
<li><a href="#benchmarking">Benchmarking</a></li>
|
||
<li><a href="#blogs">Blogs</a></li>
|
||
<li><a href="#books">Books</a></li>
|
||
<li><a href="#videos">Videos</a></li>
|
||
<li><a href="#code-analysis-and-linters">Code Analysis and
|
||
Linters</a></li>
|
||
<li><a href="#compilers-and-compiler-tools">Compilers and Compiler
|
||
Tools</a></li>
|
||
<li><a href="#concurrency">Concurrency</a></li>
|
||
<li><a href="#databases">Databases</a></li>
|
||
<li><a href="#datetime">Datetime</a></li>
|
||
<li><a href="#developer-tools">Developer Tools</a></li>
|
||
<li><a href="#exercises-and-short-examples">Exercises and Short
|
||
Examples</a></li>
|
||
<li><a href="#formal-software-verification">Formal Software
|
||
Verification</a></li>
|
||
<li><a href="#general">General</a></li>
|
||
<li><a href="#graphics">Graphics</a></li>
|
||
<li><a href="#internationalization">Internationalization</a></li>
|
||
<li><a href="#user-interface">User Interface</a></li>
|
||
<li><a href="#language-related">Language-related</a></li>
|
||
<li><a href="#large-source-code-examples">Large Source Code
|
||
Examples</a></li>
|
||
<li><a href="#logging">Logging</a></li>
|
||
<li><a href="#machine-learning">Machine Learning</a></li>
|
||
<li><a href="#messaging">Messaging</a></li>
|
||
<li><a href="#metaprogramming">Metaprogramming</a></li>
|
||
<li><a href="#metrics">Metrics</a></li>
|
||
<li><a href="#mobile-applications">Mobile Applications</a></li>
|
||
<li><a href="#networking">Networking</a></li>
|
||
<li><a href="#online-courses">Online Courses</a></li>
|
||
<li><a href="#package-management">Package Management</a></li>
|
||
<li><a href="#parallelism">Parallelism</a></li>
|
||
<li><a href="#project-starter-templates">Project Starter
|
||
Templates</a></li>
|
||
<li><a href="#printers-helpers">Printers helpers</a></li>
|
||
<li><a href="#questions">Questions</a></li>
|
||
<li><a href="#regular-expressions">Regular Expressions</a></li>
|
||
<li><a href="#science-and-technical-computing">Science and Technical
|
||
Computing</a></li>
|
||
<li><a href="#security-and-cryptography">Security and
|
||
Cryptography</a></li>
|
||
<li><a href="#semantic-technology">Semantic Technology</a></li>
|
||
<li><a href="#serialization">Serialization</a></li>
|
||
<li><a href="#system-programming">System Programming</a></li>
|
||
<li><a href="#testing">Testing</a></li>
|
||
<li><a href="#utilities">Utilities</a></li>
|
||
<li><a href="#web-development">Web Development</a></li>
|
||
</ul>
|
||
<hr />
|
||
<h2 id="community">Community</h2>
|
||
<ul>
|
||
<li><a href="https://ocaml.org/">Official OCaml Website</a></li>
|
||
<li><a href="https://discuss.ocaml.org/">OCaml Discourse Web
|
||
Forum</a></li>
|
||
<li><a href="https://discord.gg/ZBgYuvR">OCaml Discord Chat</a></li>
|
||
<li><a href="https://inbox.ocaml.org/caml-list/">Official OCaml Mailing
|
||
List</a></li>
|
||
<li><a href="https://ocaml.org/community/planet/">OCaml Planet</a></li>
|
||
<li><a href="https://www.reddit.com/r/ocaml/">OCaml SubReddit</a></li>
|
||
</ul>
|
||
<h2 id="algorithms-and-data-structures">Algorithms and Data
|
||
Structures</h2>
|
||
<ul>
|
||
<li><a
|
||
href="https://philtomson.github.io/blog/2014-05-29-comparing-a-machine-learning-algorithm-implemented-in-f-sharp-and-ocaml/">Comparing
|
||
a Machine Learning Algorithm Implemented in F# and OCaml</a></li>
|
||
<li><a href="https://github.com/backtracking/ocamlgraph">OCamlgraph</a>
|
||
– A generic graph library for OCaml.</li>
|
||
<li><a href="https://github.com/owainlewis/ods">ods</a> – A large
|
||
collection of data structures and algorithms for OCaml.</li>
|
||
<li><a href="https://github.com/backtracking/combine">combine</a> –
|
||
OCaml library for combinatorics <a
|
||
href="https://www.lri.fr/~filliatr/combine/"
|
||
class="uri">https://www.lri.fr/~filliatr/combine/</a>.</li>
|
||
<li><a href="https://github.com/mirage/decompress">Decompress</a> - A
|
||
pure OCaml implementation of Zlib.</li>
|
||
<li><a href="https://github.com/mirage/ke">Ke</a> - Fast implementation
|
||
of queue (FIFO) in OCaml.</li>
|
||
<li><a href="https://github.com/mirage/duff">Duff</a> - Implementation
|
||
of Rabin’s fingerprint and delta compression by P. MacDonald in OCaml
|
||
(same as <a
|
||
href="http://www.xmailserver.org/xdiff-lib.html">libXdiff</a></li>
|
||
<li><a href="https://github.com/komamitsu/oraft">ORaft</a> - Library of
|
||
<a href="https://raft.github.io/raft.pdf">Raft consensus algorithm</a>
|
||
implemented in OCaml</li>
|
||
<li><a href="https://github.com/dmtrKovalenko/odiff">ODiff</a> – Library
|
||
of <a
|
||
href="http://www.progmat.uaem.mx:8080/artVol2Num2/Articulo3Vol2Num2.pdf">YIQ
|
||
NTSC transmission image difference alghoritm</a> implemented in OCaml
|
||
and ReasonML.</li>
|
||
</ul>
|
||
<h2 id="application-libraries">Application Libraries</h2>
|
||
<ul>
|
||
<li><a
|
||
href="https://github.com/ocaml-batteries-team/batteries-included">Batteries
|
||
Included</a> – A community-maintained foundation library for your OCaml
|
||
projects.</li>
|
||
<li><a href="https://github.com/dbuenzli/cmdliner">Cmdliner</a> –
|
||
Declarative definition of command line interfaces for OCaml.</li>
|
||
<li><a href="https://github.com/janestreet/core">Core</a> – Jane Street
|
||
Capital’s full-fledged standard library overlay. A portable subset of
|
||
Core is also available: <a
|
||
href="https://github.com/janestreet/core_kernel">Core_kernel</a>.</li>
|
||
<li><a href="https://github.com/janestreet/base">Base</a> - Jane Street
|
||
Capital’s dependency-free, quick-compiling, fully-portable across any
|
||
environment that can run OCaml code standard library.</li>
|
||
<li><a href="http://erratique.ch/software/react">React</a> – React is an
|
||
OCaml module for functional reactive programming (FRP). It provides
|
||
support for programs with time-varying values, declarative events, and
|
||
signals.</li>
|
||
<li><a href="https://github.com/UnixJunkie/minicli">Minicli</a> –
|
||
Minimalist library for command-line parsing.</li>
|
||
<li><a href="https://github.com/mjambon/easy-format">easy-format</a> –
|
||
Pretty-printing library for OCaml.</li>
|
||
<li><a href="https://github.com/mirage/ocaml-rpc">ocaml-rpc</a> – Light
|
||
library to deal with RPCs in OCaml.</li>
|
||
<li><a
|
||
href="https://github.com/c-cube/ocaml-containers">ocaml-containers</a> –
|
||
A lightweight, modular standard library extension, string library, and
|
||
interfaces to various libraries (bigarrays, Unix, etc.) BSD
|
||
license.</li>
|
||
</ul>
|
||
<h2 id="benchmarking">Benchmarking</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/janestreet/core_bench">core_bench</a> –
|
||
Micro-benchmarking library for OCaml by Jane Street. - <a
|
||
href="https://github.com/janestreet/core_bench/wiki/Getting-Started-with-Core_bench">Getting
|
||
Started with Core_bench</a></li>
|
||
<li><a href="https://github.com/Chris00/ocaml-benchmark">benchmark</a> –
|
||
Benchmarking functions for measuring the run-time of functions using
|
||
latency or throughput.</li>
|
||
</ul>
|
||
<h2 id="blogs">Blogs</h2>
|
||
<ul>
|
||
<li><a href="http://gallium.inria.fr/blog/">Gagallium</a></li>
|
||
<li><a href="http://typeocaml.com/">Type OCaml – Many things about
|
||
OCaml</a></li>
|
||
<li><a href="https://opam.ocaml.org/blog/">OCaml Platform</a></li>
|
||
<li><a href="https://drup.github.io/">Drup’s Thingies</a></li>
|
||
<li><a href="https://soap.coffee/~lthms/tags/ocaml.html">Thomas Letan’s
|
||
articles about OCaml</a></li>
|
||
</ul>
|
||
<h2 id="books">Books</h2>
|
||
<ul>
|
||
<li><a
|
||
href="https://www.amazon.com/More-OCaml-Algorithms-Methods-Diversions/dp/0957671113/">More
|
||
OCaml: Algorithms, Methods, and Diversions</a> – In More OCaml, John
|
||
Whitington takes a meandering tour of functional programming with OCaml,
|
||
introducing various language features and describing some classic
|
||
algorithms. The book ends with a large-scale example dealing with the
|
||
production of PDF files. There are questions for each chapter, along
|
||
with worked-out answers and hints.</li>
|
||
<li><a href="http://www.greenteapress.com/thinkocaml/index.html">How to
|
||
Think Like a (Functional) Programmer</a> by Allen Downey and Nicholas
|
||
Monje – How to Think Like a Computer Scientist is an introductory
|
||
programming textbook based on the OCaml language. It is a modified
|
||
version of Think Python by Allen Downey. It is intended for newcomers to
|
||
programming and also those who know some programming but want to learn
|
||
programming in the function-oriented paradigm, or those who simply want
|
||
to learn OCaml.</li>
|
||
<li><a href="http://ocaml-book.com/">OCaml from the Very Beginning</a>
|
||
by J. Whitington - OCaml from the Very Beginning will appeal both to new
|
||
programmers and experienced programmers eager to explore functional
|
||
languages such as OCaml.</li>
|
||
<li><a
|
||
href="https://www.amazon.co.uk/Pearls-Functional-Algorithm-Design-Richard/dp/0521513383">Pearls
|
||
of Functional Algorithm Design</a> by Richard Bird - It summarizes 30
|
||
hard algorithmic problems in the function programming world. Although it
|
||
is for Haskell, the algorithm problems are very interesting, and trying
|
||
to solve them in OCaml also helps the thinking of functional
|
||
programming. Partial solutions in OCaml are <a
|
||
href="https://github.com/MassD/pearls">here</a>.</li>
|
||
<li><a href="https://realworldocaml.org/">Real World OCaml</a> by Y.
|
||
Minsky, A. Madhavapeddy, and J. Hickey - Functional Programming for the
|
||
masses.</li>
|
||
<li><a href="https://ocaml.github.io/ocamlunix/">Unix System Programming
|
||
in OCaml</a> by X. Leroy and D. Rémy – Introduction to Unix Systems
|
||
Programming, with an emphasis on communications between processes.</li>
|
||
<li><a href="https://caml.inria.fr/pub/docs/u3-ocaml">Using,
|
||
Understanding, and Unraveling OCaml</a> – This book describes both the
|
||
OCaml language and the theoretical grounds behind its powerful type
|
||
system.</li>
|
||
<li><a
|
||
href="https://www.amazon.co.uk/Purely-Functional-Structures-Chris-Okasaki/dp/0521631246/ref=sr_1_1?ie=UTF8&qid=1406279836&sr=8-1&keywords=functional+data+structures">Purely
|
||
Functional Data Structures</a> - This is the first or only book focus on
|
||
various data structures in FP world. A must-read one.</li>
|
||
<li><a
|
||
href="http://www.ffconsultancy.com/products/ocaml_for_scientists/">OCaml
|
||
for Scientists</a> - by Jon Harrop.</li>
|
||
<li><a href="https://cs3110.github.io/textbook">OCaml Programming:
|
||
Correct + Efficient + Beautiful</a> - Textbook on Functional Programming
|
||
and Data Structures in OCaml - by Michael R. Clarkson et al.</li>
|
||
</ul>
|
||
<h2 id="videos">Videos</h2>
|
||
<p> - <a
|
||
href="https://www.youtube.com/playlist?list=PLre5AT9JnKShBOPeuiD9b-I4XROIJhkIU">OCaml
|
||
Programming: Correct + Efficient + Beautiful</a> - List of 200
|
||
bite-sized videos recorded by Michael R. Clarkson. It can be watched
|
||
independently of the textbook titled the same and listed above in the <a
|
||
href="#books">Books section</a>.</p>
|
||
<h2 id="code-analysis-and-linters">Code Analysis and Linters</h2>
|
||
<ul>
|
||
<li><a href="http://mascot.x9c.fr/">Mascot</a> - Mascot is a
|
||
style-checker for OCaml sources.</li>
|
||
<li><a href="https://github.com/returntocorp/pfff">pfff</a> – pfff is a
|
||
set of tools and APIs to perform some static analysis, dynamic analysis,
|
||
code visualizations, code navigations, or style-preserving
|
||
source-to-source transformations such as refactorings on source
|
||
code.</li>
|
||
<li><a href="https://github.com/facebook/infer">Infer</a> - Infer is a
|
||
static analyzer for Java, C and Objective-C</li>
|
||
<li><a href="http://frama-c.com">Frama-C</a> - Frama-C is a static
|
||
analysis and formal proof framework for C and C++.</li>
|
||
<li><a href="https://github.com/facebook/flow">flow</a> - flow is a
|
||
static type checker for JavaScript.</li>
|
||
<li><a href="https://github.com/Microsoft/SLAyer">SLAyer</a> - SLAyer is
|
||
an automatic formal verification tool that uses separation logic to
|
||
verify memory safety of C programs.</li>
|
||
<li><a href="https://github.com/Antique-team/memcad">MemCAD</a> - MemCAD
|
||
is an abstract interpreter for shape analysis. MemCAD can verify C
|
||
programs manipulating complex data structures.</li>
|
||
<li><a href="https://github.com/upenn-cis1xx/camelot">Camelot</a> -
|
||
Camelot is a modular and fully configurable OCaml linter and
|
||
stylechecker.</li>
|
||
<li><a
|
||
href="https://github.com/formal-land/coq-of-ocaml">coq-of-ocaml</a> -
|
||
Translator from OCaml to Coq to formally verify OCaml code.</li>
|
||
<li><a href="https://gitlab.com/mopsa/mopsa-analyzer">MOPSA</a> - MOPSA
|
||
is a generic framework for building sound static analyzers based on the
|
||
theory of abstract interpretation.</li>
|
||
</ul>
|
||
<h2 id="program-analysis">Program analysis</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/BinaryAnalysisPlatform/bap">BAP</a> -
|
||
BAP is a reverse engineering and program analysis platform that targets
|
||
binary programs.</li>
|
||
<li><a href="https://github.com/airbus-seclab/bincat">BinCat</a> -
|
||
BinCat is a binary code static analysis toolkit.</li>
|
||
<li><a href="https://github.com/fkie-cad/cwe_checker">cwe_checker</a> -
|
||
cwe_checker finds vulnerable patterns in binary executables.</li>
|
||
<li><a href="https://github.com/OCamlPro/owi">Owi</a> - Owi is a
|
||
toolchain for working with WebAssembly (Wasm) in OCaml, featuring a
|
||
powerful, parallel symbolic execution engine for Wasm. It also provides
|
||
frontends for compiling and analyzing C and Rust programs.</li>
|
||
<li><a href="https://github.com/formalsec/smtml">Smt.ml</a> - Smt.ml is
|
||
a frontend OCaml library that interfaces with multiple SMT solvers,
|
||
enabling seamless integration of solvers like Z3, cvc5, Colibri2,
|
||
Bitwuzla, and Alt-Ergo within OCaml programs.</li>
|
||
</ul>
|
||
<h2 id="compilers-and-compiler-tools">Compilers and Compiler Tools</h2>
|
||
<ul>
|
||
<li><strong>Languages and Compilers</strong>:
|
||
<ul>
|
||
<li><p><a href="https://caramel.run/">Caramel</a> - Caramel is a
|
||
functional language for building type-safe, scalable, and maintainable
|
||
applications.</p></li>
|
||
<li><p><a href="http://www.cduce.org/">cDuce</a> - cDuce is a modern
|
||
XML-oriented functional language with innovative features.</p></li>
|
||
<li><p><a href="http://compcert.inria.fr/">Compcert C Compiler</a> - It
|
||
is a C Compiler supporting most of the ISO C90 and C99 / ANSI C
|
||
features.</p></li>
|
||
<li><p><a href="http://www.eff-lang.org/">Eff Programming Language</a> -
|
||
Eff is a functional language with handlers of not only exceptions, but
|
||
also of other computational effects such as state or I/O.</p></li>
|
||
<li><p><a href="https://hacklang.org/">Hack Programming
|
||
Language</a></p></li>
|
||
<li><p><a href="https://haxe.org/">Haxe Programming
|
||
Language</a></p></li>
|
||
<li><p><a href="https://nekovm.org/">Neko Programming Language</a> -
|
||
Originally the compiler was written in OCaml.</p></li>
|
||
<li><p><a href="https://github.com/mazeppa-dev/mazeppa">Mazeppa</a> - A
|
||
modern supercompiler for call-by-value functional languages.</p></li>
|
||
<li><p><a href="https://protz.github.io/mezzo/">Mezzo Programming
|
||
Language</a> - Mezzo is a programming language in the ML tradition,
|
||
which places strong emphasis on the control of aliasing and access to
|
||
mutable memory.</p></li>
|
||
<li><p><a href="http://www.ocamljava.org/">OCaml-Java</a> - OCaml to
|
||
Java bytecode compiler.</p></li>
|
||
<li><p><a href="http://opalang.org/">Opa Programming
|
||
Language</a></p></li>
|
||
<li><p><a href="https://github.com/artagnon/rhine-ml">Rhine</a> – A Lisp
|
||
on LLVM written in OCaml.</p></li>
|
||
<li><p><a href="https://www.rust-lang.org/">Rust Programming
|
||
Language</a> - Originally written in OCaml before
|
||
bootstrapping.</p></li>
|
||
<li><p><a href="http://www.cminusminus.org/">Quick C– Target
|
||
Language</a> - It is now a dead project. <a
|
||
href="https://github.com/nrnrnr/qc--">Github Repo</a>. <a
|
||
href="http://www.cs.tufts.edu/~nr/c--/qc--.html">Alternative
|
||
website</a>.</p></li>
|
||
<li><p><a
|
||
href="https://github.com/TrustInSoft/tis-interpreter">tis-interpreter</a>
|
||
- An interpreter for finding subtle bugs in programs written in standard
|
||
C</p></li>
|
||
<li><p><a href="http://facebook.github.io/reason/">Reason</a> - Friendly
|
||
syntax & toolchain for OCaml by Facebook.</p></li>
|
||
<li><p><a href="http://raml.co/index.html">RaML</a> - Resource Aware ML
|
||
(RaML) is a tool that automatically and statically computes resource-use
|
||
bounds for OCaml programs.</p></li>
|
||
<li><p><a href="https://github.com/benfaerber/liquid-ml">Liquid ML</a> -
|
||
Shopify’s Liquid Templating language for OCaml.</p></li>
|
||
</ul></li>
|
||
<li><strong>Parser and Lexer Generators</strong>:
|
||
<ul>
|
||
<li><a href="https://github.com/pyrocat101/opal">Opal</a> –
|
||
Self-contained monadic parser combinators for OCaml.</li>
|
||
<li><a href="https://github.com/ocaml-community/sedlex">Sedlex</a> is a
|
||
modern, encoding-agnostic (read: Unicode-supporting) lexer generator
|
||
(the ppx-based successor to <a
|
||
href="http://www.cduce.org/download.html#side">ulex</a>.)</li>
|
||
<li><a href="http://gallium.inria.fr/~fpottier/menhir/">Menhir</a> –
|
||
Menhir is a LR(1) parser generator for OCaml.
|
||
<ul>
|
||
<li>See <a
|
||
href="https://github.com/smolkaj/ocaml-parsing">ocaml-parsing</a> for a
|
||
clearer example of using Menhir and Sedlex to produce a useful
|
||
parser,</li>
|
||
<li>… and <a href="https://github.com/Lelio-Brun/Obelisk">Obelisk</a>, a
|
||
neat project to produce readable LaTeX, HTML, or plain-text EBNF-style
|
||
documentation for your grammar.</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="http://caml.inria.fr/pub/docs/manual-ocaml-4.01/lexyacc.html">ocamllex/ocamlyacc</a>
|
||
– lex and yacc implementation for OCaml.</li>
|
||
<li><a href="https://github.com/inhabitedtype/angstrom">Angstrom</a> -
|
||
Parser combinators built for speed and memory efficiency</li>
|
||
</ul></li>
|
||
<li><strong>Articles</strong>:
|
||
<ul>
|
||
<li><a
|
||
href="http://llvm.org/docs/tutorial/OCamlLangImpl1.html">Kaleidoscope:
|
||
Implementing a Language with LLVM in Objective Caml¶</a></li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="concurrency">Concurrency</h2>
|
||
<p>Two concurrency libraries exist in OCaml: <em>Lwt</em> and
|
||
<em>Async</em>. They provide very similar functionality but make
|
||
radically different decisions with regards to error handling and
|
||
internal implementation details (see the links below for more details).
|
||
<a href="https://realworldocaml.org/">Real World OCaml</a> uses Async,
|
||
but a version of the <a href="https://github.com/dkim/rwo-lwt">code
|
||
examples translated to Lwt</a> is also available.</p>
|
||
<ul>
|
||
<li><strong>Libraries</strong>:
|
||
<ul>
|
||
<li><a href="http://ocsigen.org/lwt/">Lwt</a> — A cooperative threads
|
||
library for OCaml.</li>
|
||
<li><a href="https://opensource.janestreet.com/async/">Async</a> — A
|
||
monadic concurrence library to go with the Core library.</li>
|
||
</ul></li>
|
||
<li><strong>Articles</strong>:
|
||
<ul>
|
||
<li><a href="https://blog.janestreet.com/announcing-async/">The blog
|
||
post that introduced Async</a></li>
|
||
<li><a href="http://rgrinberg.com/posts/abandoning-async/">A user gives
|
||
up on Async</a></li>
|
||
<li><a
|
||
href="http://philtomson.github.io/blog/2014/07/09/core-dot-async-example/">Cooperative
|
||
Concurrency in OCaml: A Core.Std.Async Example</a>.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<p>There is also an ongoing experimental project to make OCaml
|
||
multiprocessor and multicore aware at <a
|
||
href="https://github.com/ocamllabs/ocaml-multicore">OCaml multicore</a>
|
||
fork.</p>
|
||
<h2 id="databases">Databases</h2>
|
||
<ul>
|
||
<li><strong>Bindings</strong>
|
||
<ul>
|
||
<li><a href="https://forge.ocamlcore.org/projects/camldbm/">Dbm</a> — A
|
||
binding to the NDBM/GDBM Unix “databases”.</li>
|
||
<li><a href="https://massd.github.io/mongo/">Mongo.ml</a> – An OCaml
|
||
driver for Mongodb</li>
|
||
<li><a href="http://pgocaml.forge.ocamlcore.org/">PG’OCaml</a> — A
|
||
type-safe interface to PostgreSQL in pure OCaml.
|
||
<ul>
|
||
<li><a href="https://github.com/tizoc/ppx_pgsql">ppx_pgsql</a> – A
|
||
syntax extension for embedded SQL queries using PG’OCaml.</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://mmottl.github.io/postgresql-ocaml/">PostgreSQL-OCaml</a> —
|
||
An interface to PostgreSQL through the C API (<code>libpq</code>).</li>
|
||
<li><a href="https://github.com/mmottl/sqlite3-ocaml">SQLite3</a> —
|
||
OCaml bindings to the SQLite3 database.</li>
|
||
<li><a href="https://mlin.github.io/ocaml-sqlite3EZ/">Sqlite3EZ</a> —
|
||
Thin wrapper for SQLite3 with a simplified interface.</li>
|
||
<li><a href="https://github.com/0xffea/ocaml-redis">ocaml-redis</a> –
|
||
Redis bindings for OCaml.</li>
|
||
<li><a href="http://ygrek.org.ua/p/ocaml-mysql/">mysql</a> – Bindings to
|
||
libmysqlclient for interacting with MySQL databases.</li>
|
||
<li><a href="https://github.com/arenadotio/pgx">pgx</a> – A pure OCaml
|
||
PostgreSQL client library.</li>
|
||
<li><a
|
||
href="https://github.com/slegrand45/mysql_protocol">mysql_protocol</a> –
|
||
Implementation of MySQL Protocol with the Bitstring library.</li>
|
||
</ul></li>
|
||
<li><strong>New Implementations</strong>
|
||
<ul>
|
||
<li><a href="https://github.com/mirage/irmin">Irmin</a> — A distributed
|
||
database that follows the same design principles as Git.</li>
|
||
<li><a href="http://obigstore.forge.ocamlcore.org/">Obigstore</a> — A
|
||
database with BigTable-like data model atop LevelDB.</li>
|
||
<li><a href="https://github.com/RunOrg/RunOrg">RunOrg</a> - It is a WIP
|
||
database server written in OCaml.</li>
|
||
<li><a href="https://github.com/UnixJunkie/dokeysto">dokeysto</a> - dumb
|
||
OCaml key-value store, string keys and string values. Optional
|
||
on-the-fly LZ4 compression of values or tokyocabinet backend.</li>
|
||
</ul></li>
|
||
<li><strong>Overlays</strong>
|
||
<ul>
|
||
<li><a href="https://github.com/andrenth/sequoia">Sequoia</a> - Sequoia
|
||
is a type-safe query builder for MySQL/MariaDB and PostgreSQL</li>
|
||
<li><a href="https://github.com/ocsigen/macaque">Macaque</a> — Macaque
|
||
is a library for safe and flexible database queries using comprehensions
|
||
on top of PG’OCaml.</li>
|
||
<li><a href="https://github.com/mirage/orm">ORM</a> — ORM for
|
||
SQLite.</li>
|
||
<li><a href="https://github.com/paurkedal/ocaml-caqti">Caqti</a> -
|
||
Cooperative-threaded access to relational data</li>
|
||
<li><a href="https://github.com/roddyyaga/ppx_rapper">Caqti setence
|
||
preparation, ppx_rapper</a></li>
|
||
</ul></li>
|
||
<li><strong>Articles</strong>:
|
||
<ul>
|
||
<li><a
|
||
href="https://andreas.github.io/2014/08/22/implementing-the-binary-memcached-protocol-with-ocaml-and-bitstring/">Implementing
|
||
the Binary Memcached Protocol with Ocaml and Bitstring</a></li>
|
||
<li><a
|
||
href="https://medium.com/@bobbypriambodo/interfacing-ocaml-and-postgresql-with-caqti-a92515bdaa11">Interfacing
|
||
OCaml and PostgreSQL with Caqti</a></li>
|
||
<li><a
|
||
href="https://www.cs.tsukuba.ac.jp/~kam/papers/pepm2016a.pdf">Finally,
|
||
Type-Safe, Extensible and Efficient Language Integrated Query</a> by
|
||
Oleg and Co. The proposed approach is to describe SQL queries in
|
||
type-safe manner and optimize them (using term rewriting or
|
||
normalization-by evaluation) before sending to database engine. It
|
||
potentially could optimize O(n^2) queries to O(n) ones.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="datetime">Datetime</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/sagotch/ISO8601.ml">ISO8601</a></li>
|
||
<li><a href="http://calendar.forge.ocamlcore.org/">calendar</a></li>
|
||
<li><a href="https://github.com/hhugo/odate">odate</a></li>
|
||
<li><a href="http://erratique.ch/software/ptime">ptime</a></li>
|
||
</ul>
|
||
<h2 id="developer-tools">Developer Tools</h2>
|
||
<ul>
|
||
<li><p><a href="https://try.ocamlpro.com/">Try OCaml</a> – Try OCaml in
|
||
your web browser.</p></li>
|
||
<li><p><a
|
||
href="https://github.com/ocaml-sf/learn-ocaml">learn-ocaml</a>. Web app
|
||
(written in OCaml) underlying the learn-ocaml-corpus. Can be customized
|
||
to serve lectures (with Markdown slides), playgrounds (with a toplevel
|
||
prelude), and interactive exercises (with OCaml tests). MIT
|
||
License.</p></li>
|
||
<li><p><a
|
||
href="https://github.com/pfitaxel/learn-ocaml.el">learn-ocaml.el</a>.
|
||
Minor mode for Emacs that can display exercise topics and grade exercise
|
||
solutions, after logging to a Learn-OCaml instance. MIT
|
||
License.</p></li>
|
||
<li><p><a href="https://betterocaml.ml">BetterOCaml</a> – An efficient,
|
||
intuitive, and cross-platform web IDE with your OCaml code interpreted
|
||
and running in your browser!</p></li>
|
||
<li><p><a
|
||
href="https://www.tutorialspoint.com/compile_ocaml_online.php">codingground</a>
|
||
– Compile and execute OCaml code online.</p></li>
|
||
<li><p><a
|
||
href="https://apps.apple.com/app/ocaml-learn-code/id1547506826">OCaml:
|
||
Learn & Code iOS app</a> - Learn and execute OCaml code from your
|
||
iPhone/iPad/Mac.</p></li>
|
||
<li><p><a href="https://github.com/akabe/ocaml-jupyter">Jupyter</a> – An
|
||
OCaml kernel for the Jupyter notebook.</p></li>
|
||
<li><p><a href="https://github.com/ocaml-community/utop">utop</a> –
|
||
Universal toplevel for OCaml with support for multiline edition,
|
||
history, real-time and context-sensitive completion, colors, and
|
||
more.</p></li>
|
||
<li><p><a
|
||
href="https://github.com/ocaml-ppx/ocamlformat">ocamlformat</a> - A
|
||
command-line tool to format OCaml code.</p></li>
|
||
<li><p><a
|
||
href="http://caml.inria.fr/pub/docs/manual-ocaml/browser.html">ocamlbrowser</a>
|
||
– A source and compiled interface browser, written using LablTk.
|
||
Included in the standard distribution for ocaml <= 4.01 and with
|
||
labltk for ocaml >= 4.02.</p></li>
|
||
<li><p><a href="https://github.com/samoht/ghim">ghim</a> – A
|
||
command-line tool to manage Github Issues.</p></li>
|
||
<li><p><a href="https://github.com/mabrasil/generator-ocaml">OCaml
|
||
Yeoman Generator</a> – Yeoman generator to scaffold OCaml
|
||
modules.</p></li>
|
||
<li><p><a href="https://github.com/khalidbelk/puml2xml">puml2xml</a> – A
|
||
PlantUML (<strong>.puml</strong>) to XML (<strong>.xmi</strong>)
|
||
converter.</p></li>
|
||
<li><p><strong>Foreign Function Interface</strong>:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/ocamllabs/ocaml-ctypes">ctypes</a> –
|
||
Library for binding to C libraries using pure OCaml.</li>
|
||
<li><a
|
||
href="https://github.com/johnwhitington/ocaml-main-program-in-c">ocaml-main-program-in-c</a>
|
||
– Example build system for making mixed C/Ocaml binaries where the main
|
||
program is in C.</li>
|
||
<li><a
|
||
href="http://openmirage.org/blog/modular-foreign-function-bindings">Modular
|
||
foreign function bindings</a></li>
|
||
<li><a href="https://github.com/thierry-martinez/pyml">Py.ml</a> - OCaml
|
||
bindings for Python.</li>
|
||
</ul></li>
|
||
<li><p><strong>Editor Integration</strong>:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/ocaml/ocaml-lsp">ocaml-lsp</a> - An LSP
|
||
language server for OCaml that integrates with any editor that
|
||
understands LSP like <a
|
||
href="https://github.com/microsoft/vscode">VSCode</a>, Vim and
|
||
Emacs.</li>
|
||
<li><a href="https://github.com/ocaml/merlin">merlin</a> – Context
|
||
sensitive completion for OCaml in Vim and Emacs.</li>
|
||
<li><a href="https://github.com/ocaml/tuareg">tuareg</a> - OCaml mode
|
||
for Emacs that can run the toplevel and the debugger within Emacs.</li>
|
||
<li><a
|
||
href="https://github.com/ProofGeneral/opam-switch-mode">opam-switch-mode</a>
|
||
- Minor mode for Emacs that extends Tuareg and Merlin with menus to
|
||
change or reset the opam switch in the ambient Emacs session.</li>
|
||
<li><a href="https://github.com/Khady/merlin-eldoc">merlin-eldoc</a> –
|
||
Emacs package to provide merlin’s features through eldoc.</li>
|
||
<li><a href="https://github.com/hackwaly/vscode-ocaml">vscode-ocaml</a>
|
||
– extension that provides OCaml language support for <a
|
||
href="https://github.com/microsoft/vscode">VSCode</a></li>
|
||
<li><a href="https://github.com/hackwaly/ocamlearlybird">OCaml
|
||
Debugger</a> – extension that provides OCaml Debugger for <a
|
||
href="https://github.com/microsoft/vscode">VSCode</a></li>
|
||
<li><a href="https://github.com/whitequark/sublime-better-ocaml">Sublime
|
||
better ocaml</a> – Better OCaml mode for Sublime Text.
|
||
<ul>
|
||
<li><a href="https://github.com/def-lkb/sublime-text-merlin">Sublime
|
||
text package</a></li>
|
||
</ul></li>
|
||
<li><a href="http://www.typerex.org/ocp-index.html">ocp-index</a> – Easy
|
||
access to the interface information of installed OCaml libraries.
|
||
Provides standalone tools like <code>ocp-browser</code> and
|
||
<code>ocp-grep</code>.
|
||
<ul>
|
||
<li><a
|
||
href="http://www.typerex.org/ocp-index.html#ocp-browser">ocp-browser</a>
|
||
– Small ncurses-based API and documentation browser.</li>
|
||
<li><a href="https://github.com/reynir/ocp-index-top">ocp-index-top</a>
|
||
– Toplevel directive for looking up documentation using ocp-index.</li>
|
||
<li><a
|
||
href="https://sublime.wbond.net/packages/OCaml%20Autocompletion">Sublime
|
||
text package</a></li>
|
||
</ul></li>
|
||
<li><a href="http://www.typerex.org/ocp-indent.html">ocp-indent</a> –
|
||
Indentation tool for OCaml, to be used from editors like Emacs and Vim.
|
||
<ul>
|
||
<li><a href="https://github.com/def-lkb/ocp-indent-vim">Vim
|
||
plugin</a>.</li>
|
||
</ul></li>
|
||
</ul></li>
|
||
<li><p><strong>Code coverage</strong>:</p>
|
||
<ul>
|
||
<li><a href="https://github.com/aantron/bisect_ppx">Bisect_ppx</a></li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="exercises-and-short-examples">Exercises and Short Examples</h2>
|
||
<ul>
|
||
<li><a href="https://ocaml.org/learn/tutorials/99problems.html">99
|
||
problems</a>. 99% of the solutions are <a
|
||
href="https://github.com/MassD/99">here</a>.</li>
|
||
<li><a
|
||
href="https://ocaml-sf.org/learn-ocaml-public/#activity=exercises">learn-ocaml-corpus</a>.
|
||
Corpus of beginner-to-advanced online exercises (including those from
|
||
the OCaml MOOC) with automatic grading tests.</li>
|
||
<li><a href="http://rosettacode.org/wiki/Category:OCaml">Rosetta
|
||
Code</a></li>
|
||
<li><a href="http://exercism.io/languages/ocaml">OCaml at Exercism</a> –
|
||
Exercism is your place to engage in thoughtful conversations about code.
|
||
Explore simplicity, idiomatic language features, and expressive,
|
||
readable code. <a
|
||
href="https://github.com/exercism/xocaml">Solutions</a>.</li>
|
||
<li><a
|
||
href="http://pleac.sourceforge.net/pleac_ocaml/index.html">Programming
|
||
Language Examples Alike Cookbook</a> - The OCaml section of the book is
|
||
a free reference for solving common programming problems using
|
||
OCaml.</li>
|
||
</ul>
|
||
<h2 id="formal-software-verification">Formal Software Verification</h2>
|
||
<ul>
|
||
<li><a href="https://coq.inria.fr/">Coq</a> – Coq is a formal proof
|
||
management system. It provides a formal language to write mathematical
|
||
definitions, executable algorithms, and theorems, together with an
|
||
environment for semi-interactive development of machine-checked
|
||
proofs.</li>
|
||
<li><a href="http://why3.lri.fr/">Why3</a> – Why3 is a platform for
|
||
deductive program verification. It provides a rich language for
|
||
specification and programming, called WhyML, and relies on external
|
||
theorem provers, both automated and interactive, to discharge
|
||
verification conditions.</li>
|
||
<li><a href="http://alt-ergo.lri.fr/">Alt-Ergo</a> – Alt-Ergo is an
|
||
open-source SMT solver dedicated to the proof of mathematical formulas
|
||
generated in the context of program verification.</li>
|
||
</ul>
|
||
<h2 id="general">General</h2>
|
||
<ul>
|
||
<li><a
|
||
href="https://haifengl.wordpress.com/2014/06/17/ocaml-introduction/">Functional
|
||
Programming with OCaml</a></li>
|
||
<li><a
|
||
href="http://roscidus.com/blog/blog/2014/06/06/python-to-ocaml-retrospective/">Python
|
||
to OCaml: retrospective</a></li>
|
||
<li><a href="http://queue.acm.org/detail.cfm?id=2038036">OCaml for the
|
||
Masses</a></li>
|
||
<li><a
|
||
href="https://espertech.wordpress.com/2014/07/15/why-we-use-ocaml">Why
|
||
We Use OCaml</a></li>
|
||
<li><a href="http://wiki.xen.org/wiki/OCaml_Coding_Considerations">Xen –
|
||
OCaml Coding Considerations</a></li>
|
||
<li><a
|
||
href="http://lambda-diode.com/programming/monads-are-a-class-of-hard-drugs">Monads
|
||
are a class of hard drugs</a></li>
|
||
<li><a
|
||
href="http://blog.nullspace.io/beginners-guide-to-ocaml-beginners-guides.html">Beginner’s
|
||
guide to OCaml</a></li>
|
||
<li><a
|
||
href="http://spyder.wordpress.com/2014/03/16/why-ocaml-why-now/">Why
|
||
OCaml, why now?</a></li>
|
||
<li><a href="http://cranialburnout.blogspot.ca/">A blog about game
|
||
development in OCaml</a></li>
|
||
<li><a
|
||
href="http://ocamltutorials.blogspot.se/2013/06/alternatives-to-subtyping.html">(Functional)
|
||
Alternatives to inheritance</a></li>
|
||
<li><a href="https://github.com/johnwhitington/camlpdf">camlPDF</a> –
|
||
OCaml library for reading, writing and modifying PDF files.</li>
|
||
<li><a href="https://github.com/Leonidas-from-XIV/slacko">slacko</a> – A
|
||
neat interface for Slack in OCaml.</li>
|
||
<li><a href="https://learnxinyminutes.com/docs/ocaml/">Learn X in Y
|
||
minutes</a> - Where X=OCaml.</li>
|
||
</ul>
|
||
<h2 id="graphics">Graphics</h2>
|
||
<ul>
|
||
<li><strong>2D</strong>
|
||
<ul>
|
||
<li><a href="http://archimedes.forge.ocamlcore.org/">archimedes</a> — 2D
|
||
plotting library.</li>
|
||
<li><a href="https://github.com/Chris00/ocaml-cairo">cairo2</a> —
|
||
Binding to Cairo, a 2D Vector Graphics Library. Integrates well with
|
||
lablgtk.</li>
|
||
<li><a href="https://github.com/dbuenzli/vg">Vg</a> – Declarative 2D
|
||
vector graphics for OCaml.</li>
|
||
</ul></li>
|
||
<li><strong>3D</strong>
|
||
<ul>
|
||
<li><a href="https://github.com/fccm/glMLite">glMLite</a> — OpenGL
|
||
bindings for OCaml. Provides an (experimental) functional API. (<a
|
||
href="http://decapode314.free.fr/ocaml/GL/">homepage</a>)</li>
|
||
<li><a href="https://forge.ocamlcore.org/projects/lablgl/">lablgl</a> —
|
||
Interface to OpenGL. Integrates well with lablgtk.</li>
|
||
<li><a href="http://erratique.ch/software/tgls">tgls</a> — Thin bindings
|
||
OpenGL 3.{2,3},4.{0,1,2,3,4} and OpenGL ES {2,3}.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="internationalization">Internationalization</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/yoriyuki/Camomile/">Camomile</a> — A
|
||
Unicode library for OCaml.</li>
|
||
<li><a href="https://github.com/whitequark/ocaml-m17n">ocaml-m17n</a> —
|
||
Multilingualization for OCaml source code. Allows using Unicode
|
||
identifiers in OCaml source code.</li>
|
||
<li><a href="https://github.com/dbuenzli/uucd">Uucd</a> — Unicode
|
||
character database decoder for OCaml.</li>
|
||
<li><a href="https://github.com/dbuenzli/uucp">Uucp</a> — Unicode
|
||
character properties for OCaml.</li>
|
||
<li><a href="https://github.com/dbuenzli/uunf">Uunf</a> — Unicode text
|
||
normalization for OCaml.</li>
|
||
<li><a href="https://github.com/dbuenzli/uuseg">Uuseg</a> — Unicode text
|
||
segmentation for OCaml.</li>
|
||
<li><a href="https://github.com/dbuenzli/uutf">Uutf</a> — Non-blocking
|
||
streaming Unicode codec for OCaml.</li>
|
||
</ul>
|
||
<h2 id="user-interface">User Interface</h2>
|
||
<ul>
|
||
<li><a href="https://garrigue.github.io/lablgtk/">lablgtk</a> — GTK2 and
|
||
GTK3 bindings for OCaml with various higher-level facilities to define
|
||
GUIs.</li>
|
||
<li><a href="https://github.com/Kakadu/lablqml">lablqml</a> – QML Qt5
|
||
bindings for OCaml.</li>
|
||
<li><a href="https://forge.ocamlcore.org/projects/labltk/">labltk</a> —
|
||
Interface to the Tcl/Tk GUI framework. In the standard distribution for
|
||
ocaml <= 4.01.</li>
|
||
<li><a href="http://erratique.ch/software/tsdl">TSDL</a> – Tsdl is an
|
||
OCaml module providing thin bindings to the cross-platform SDL
|
||
library.</li>
|
||
<li><a
|
||
href="https://github.com/ocaml-community/lambda-term">Lambda-Term</a> –
|
||
Lambda-Term is a cross-platform library for manipulating the terminal.
|
||
It provides an abstraction for keys, mouse events, and colors, as well
|
||
as a set of widgets to write curses-like applications.</li>
|
||
<li><a href="https://github.com/pqwy/notty">Notty</a> - Notty is a
|
||
declarative terminal library for OCaml, structured around the notion of
|
||
composable images.</li>
|
||
<li><a
|
||
href="https://github.com/ocaml-community/ocaml-linenoise">ocaml-linenoise</a>
|
||
- Self-contained OCaml bindings to linenoise; easy high-level readline
|
||
functionality in OCaml.</li>
|
||
</ul>
|
||
<h2 id="language-related">Language-related</h2>
|
||
<ul>
|
||
<li><a
|
||
href="http://devmusings.legiasoft.com/blog/2008/05/23/higher-rank_polymorphism_in_ocaml">Higher-Rank
|
||
Polymorphism in OCaml</a></li>
|
||
<li><a href="https://github.com/mjambon/mikmatch">mikmatch</a> – OCaml
|
||
pattern-matching extended with regexps</li>
|
||
<li><a
|
||
href="https://www.lexifi.com/ocaml/inlined-records-constructors/">Inlined
|
||
records in constructors</a></li>
|
||
<li><a
|
||
href="https://espertech.wordpress.com/2014/07/30/algebraic-data-types/">Algebraic
|
||
Data Types</a></li>
|
||
<li><a
|
||
href="http://wiki.xen.org/wiki/OCaml_Best_Practices_for_Developers">XEN
|
||
– OCaml Best Practices for Developers</a></li>
|
||
<li><a href="https://opensource.janestreet.com/standards/">OCaml Style
|
||
Guide (by Jane Street)</a> - See also: <a
|
||
href="https://www.seas.upenn.edu/~cis500/cis500-f06/resources/programming_style.html">[1]</a>,
|
||
<a
|
||
href="http://www.cs.cornell.edu/Courses/cs312/2001sp/style.html">[2]</a>,
|
||
<a
|
||
href="https://www.seas.upenn.edu/~cis120/20fa/ocaml_style/">[3]</a>.</li>
|
||
<li><a
|
||
href="https://camlspotter.blogspot.com/2012/09/a-safe-but-strange-way-of-modifying.html">A
|
||
safe but strange way of modifying OCaml compiler</a></li>
|
||
<li><a
|
||
href="https://technotroph.wordpress.com/2013/10/25/fiddling-with-the-ocaml-type-system/">Fiddling
|
||
with the OCaml Type System</a></li>
|
||
</ul>
|
||
<h2 id="large-source-code-examples">Large Source Code Examples</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/janestreet/base">Base</a> - Standard
|
||
library for OCaml</li>
|
||
<li><a href="https://github.com/cil-project/cil">cil</a> - C
|
||
Intermediate Language</li>
|
||
<li><a href="https://github.com/coq/coq">coq</a> - formal proof
|
||
management system</li>
|
||
<li><a href="https://git.frama-c.com/pub/frama-c">frama-c</a> - platform
|
||
dedicated to the analysis of source code written in C</li>
|
||
<li><a href="https://github.com/libguestfs/libguestfs">libguestfs</a> -
|
||
library and tools for accessing and modifying virtual machine disk
|
||
images</li>
|
||
<li><a href="https://github.com/savonet/liquidsoap">Liquidsoap</a> - a
|
||
swiss-army knife for multimedia streaming, notably used for netradios
|
||
and webtvs</li>
|
||
<li><a href="https://github.com/mirage/mirage">mirage</a> - library
|
||
operating system that constructs unikernels for secure, high-performance
|
||
network applications across a variety of cloud computing and mobile
|
||
platforms</li>
|
||
<li><a href="https://github.com/ygrek/mldonkey">MLDonkey</a> -
|
||
cross-platform multi-network peer-to-peer daemon</li>
|
||
<li><a href="https://github.com/onivim/oni2">Oni2</a> - Native,
|
||
lightweight modal code editor.</li>
|
||
<li><a href="https://github.com/returntocorp/pfff">pfff</a> - an OCaml
|
||
API to write static analysis, dynamic analysis, code visualizations,
|
||
code navigations, or style-preserving source-to-source transformations
|
||
such as refactorings on source code.</li>
|
||
<li><a href="https://gitlab.com/tezos/tezos">Tezos</a> - a
|
||
self-upgradable Proof of Stake blockchain</li>
|
||
<li><a href="https://gitlab.inria.fr/why3/why3">WHY3</a> - platform for
|
||
deductive program verification</li>
|
||
<li><a href="https://github.com/xapi-project/xen-api">xen-api</a> -
|
||
management stack that configures and controls Xen-enabled hosts and
|
||
resource pools, and co-ordinates resources within the pool.</li>
|
||
</ul>
|
||
<h2 id="logging">Logging</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/UnixJunkie/dolog">dolog</a> – A dumb
|
||
OCaml logger.</li>
|
||
<li><a href="https://github.com/codinuum/volt">Volt</a> – A variant of
|
||
the Bolt OCaml logging tool.</li>
|
||
<li><a href="http://erratique.ch/software/logs">Logs</a> - Logs provides
|
||
a logging infrastructure for OCaml.</li>
|
||
</ul>
|
||
<h2 id="machine-learning">Machine Learning</h2>
|
||
<ul>
|
||
<li><strong>Libraries</strong>
|
||
<ul>
|
||
<li><a href="https://github.com/lehy/ocaml-sklearn">Ocaml-sklearn</a>
|
||
scikit-learn for OCaml.</li>
|
||
<li><a href="https://ocaml.xyz/">Owl</a> - Scientific library with
|
||
neural networks, algorithmic differentiation and ONNX support.</li>
|
||
<li><a href="https://github.com/owlbarn/owl_mask_rcnn">Object detection
|
||
convolutional neural network with OCaml (based on Owl)</a>.</li>
|
||
<li><a href="https://github.com/LaurentMazare/ocaml-torch">PyTorch
|
||
bindings</a> - OCaml bindings for PyTorch.</li>
|
||
<li><a href="https://github.com/ck090/ocaml-nn/tree/main">Ocaml-NN</a> -
|
||
Fully functional monadic implementation of a Neural Network (FCNNs) in
|
||
OCaml</li>
|
||
</ul></li>
|
||
<li><strong>Articles</strong>
|
||
<ul>
|
||
<li><a
|
||
href="https://blog.janestreet.com/deep-learning-experiments-in-ocaml/">Deep
|
||
Learning with OCaml (PyTorch bindings)</a>.</li>
|
||
<li><a
|
||
href="https://blog.janestreet.com/of-pythons-and-camels/">Transfer
|
||
Learning with OCaml (PyTorch bindings)</a>.</li>
|
||
<li><a
|
||
href="https://blog.janestreet.com/playing-atari-games-with-ocaml-and-deep-rl/">Reinforcement
|
||
Learning with OCaml (PyTorch bindings)</a>.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="messaging">Messaging</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/issuu/ocaml-zmq">ocaml-zmq</a> – ZeroMQ
|
||
bindings for OCaml with Async and Lwt wrappers.</li>
|
||
<li><a href="https://github.com/rgrinberg/onanomsg">onanomsg</a> –
|
||
nanomsg bindings for OCaml.</li>
|
||
<li><a href="https://github.com/didier-wenzek/ocaml-kafka">Kafka</a> –
|
||
OCaml bindings for Apache Kafka.</li>
|
||
<li><a href="https://github.com/andersfugmann/amqp-client">AMQP</a> –
|
||
AMQP client library for Async and Lwt.</li>
|
||
<li><a href="https://github.com/xavierleroy/ocamlmpi">MPI</a> – Message
|
||
Passing Interface bindings for OCaml.</li>
|
||
<li><a href="https://github.com/j0sh/ocaml-mqtt">MQTT</a> – OCaml
|
||
implementation of the MQTT pubsub protocol.</li>
|
||
<li><a href="https://github.com/capnproto/capnp-ocaml">capnp-ocaml</a> –
|
||
OCaml code generator plugin for the Cap’n Proto serialization
|
||
framework.</li>
|
||
</ul>
|
||
<h2 id="metaprogramming">Metaprogramming</h2>
|
||
<ul>
|
||
<li><strong>Articles</strong>:
|
||
<ul>
|
||
<li><a
|
||
href="http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/">A
|
||
Guide to Extension Points in OCaml</a></li>
|
||
<li><a
|
||
href="https://blogs.janestreet.com/extension-points-or-how-ocaml-is-becoming-more-like-lisp">Extension
|
||
Points, or how OCaml is becoming more like Lisp</a></li>
|
||
<li><a
|
||
href="https://www.lexifi.com/ocaml/syntax-extensions-without-camlp4-lets-do-it/">Syntax
|
||
extensions without Camlp4: let’s do it!</a></li>
|
||
<li><a
|
||
href="https://ambassadortothecomputers.blogspot.com/p/reading-camlp4.html">Reading
|
||
Camlp4 – Ambassador to the Computers</a></li>
|
||
</ul></li>
|
||
<li><strong>Syntax Extensions</strong>:
|
||
<ul>
|
||
<li><a href="https://github.com/ocaml-ppx/ppx_import">ppx_import</a> –
|
||
Import is a syntax extension that allows to pull in types or signatures
|
||
from other compiled interface files.</li>
|
||
<li><a
|
||
href="https://github.com/sheijk/ppx_string_interpolate">ppx_string_interpolate</a>
|
||
– A simple ppx filter to support string interpolation like
|
||
<code>[%str "value of foo is $(foo)"]</code>.</li>
|
||
<li><a href="https://github.com/rizo/ppx_monad">ppx_monad</a> – Monad
|
||
syntax extension for OCaml.</li>
|
||
<li><a
|
||
href="https://github.com/whitequark/ppx_deriving_yojson">ppx_deriving_yojson</a>
|
||
– A Yojson codec generator for OCaml.</li>
|
||
</ul></li>
|
||
<li><strong>Tools and Language Extensions</strong>:
|
||
<ul>
|
||
<li><a href="http://okmij.org/ftp/ML/MetaOCaml.html">MetaOCaml</a> – an
|
||
OCaml dialect for multi-stage programming.</li>
|
||
<li><a href="http://bobzhang.github.io/fan/">Fan</a> – Fan is a
|
||
compile-time metaprogramming system for OCaml, originally inspired from
|
||
Camlp4. It’s a combination of OCaml and Lispy Macros. It shares the same
|
||
concrete syntax with OCaml.</li>
|
||
<li><a href="https://camlp5.github.io/">camlp5</a> - Camlp5 is a
|
||
preprocessor-pretty-printer of OCaml.</li>
|
||
<li><a
|
||
href="http://caml.inria.fr/pub/docs/manual-camlp4/manual002.html">camlp4</a>
|
||
- Camlp4 is part of the standard OCaml distribution and is different
|
||
from Camlp5.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="metrics">Metrics</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/mirage/prometheus">prometheus</a> –
|
||
OCaml client library for Prometheus monitoring.</li>
|
||
</ul>
|
||
<h2 id="mobile-applications">Mobile Applications</h2>
|
||
<ul>
|
||
<li><strong>Articles</strong>:
|
||
<ul>
|
||
<li><a
|
||
href="http://psellos.com/2014/08/2014.08.ocamlxarm-402.html">OCaml on
|
||
iOS 7 Released</a></li>
|
||
<li><a
|
||
href="https://dannywillems.github.io/2016/07/14/ocaml-cordova-secured-typed-hybrid-mobile-applications.html">OCaml
|
||
+ Cordova = more secured, typed and hybrid mobile applications</a></li>
|
||
</ul></li>
|
||
<li><strong>Bindings</strong>:
|
||
<ul>
|
||
<li><a
|
||
href="https://github.com/dannywillems/ocaml-cordova-plugin-list">Cordova
|
||
plugins</a> – List of bindings to Cordova plugins. Get access to native
|
||
device components like accelerometer, SMS, geolocation, etc in
|
||
OCaml.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="networking">Networking</h2>
|
||
<ul>
|
||
<li><strong>HTTP Tools</strong>:
|
||
<ul>
|
||
<li><a href="https://github.com/mirage/ocaml-cohttp">ocaml-cohttp</a> –
|
||
Very lightweight HTTP server using Lwt or Async.</li>
|
||
<li><a href="https://github.com/ygrek/ocurl">ocurl</a> – OCaml bindings
|
||
to libcurl.</li>
|
||
<li><a href="https://github.com/inhabitedtype/httpaf">httpaf</a> – A
|
||
high performance, memory efficient, and scalable web server written in
|
||
OCaml.</li>
|
||
<li><a href="https://github.com/anmonteiro/piaf">piaf</a> -
|
||
Client/server library for HTTP/1.X / HTTP/2 written entirely in
|
||
OCaml.</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/mirage/ocaml-dns">ocaml-dns</a> – A pure
|
||
OCaml implementation of the DNS protocol.</li>
|
||
<li><a
|
||
href="https://github.com/fluent/fluent-logger-ocaml">fluent-logger</a> –
|
||
Fluentd logger for OCaml.</li>
|
||
<li><a href="https://github.com/haesbaert/charrua-unix">charrua-unix</a>
|
||
- charrua-unix is a Unix DHCP daemon based on <a
|
||
href="https://github.com/haesbaert/charrua-core">charrua-core</a>.</li>
|
||
</ul>
|
||
<h2 id="online-courses">Online Courses</h2>
|
||
<ul>
|
||
<li><a
|
||
href="https://www.fun-mooc.fr/en/courses/introduction-functional-programming-ocaml/">OCaml
|
||
MOOC: Introduction to Functional Programming in OCaml</a> - Videos
|
||
available in <a
|
||
href="https://www.youtube.com/playlist?list=PLTBEN441uEY36t5CCrJkdTSv588d3nWN5">this
|
||
playlist</a> of the <a href="https://ocaml-sf.org/">OCaml Software
|
||
Foundation</a> YouTube channel.</li>
|
||
<li><a
|
||
href="http://www.cs.cornell.edu/Courses/cs3110/2014fa/course_info.php">Cornell
|
||
University – Data Structures and Functional Programming</a>.</li>
|
||
<li><a
|
||
href="http://www.cs.princeton.edu/~dpw/courses/cos326-12/">Princeton
|
||
University - Functional programming in OCaml</a>.</li>
|
||
<li><a href="https://courses.engr.illinois.edu/cs421/fa2014/">University
|
||
of Illinois</a> - Course that uses OCaml to teach functional programming
|
||
and programming language design</li>
|
||
</ul>
|
||
<h2 id="package-management">Package Management</h2>
|
||
<ul>
|
||
<li><strong>Distribution</strong>:
|
||
<ul>
|
||
<li><a href="http://opam.ocamlpro.com/">OPAM</a> – A flexible
|
||
Git-friendly package manager with multiple compiler support.</li>
|
||
<li><a
|
||
href="http://projects.camlcity.org/projects/findlib.html">ocamlfind</a>
|
||
— Local OCaml library manager. Used by most of the OCaml ecosystem.</li>
|
||
<li><a href="https://fdopen.github.io/opam-repository-mingw">OCaml for
|
||
Windows</a> - opam repository and experimental build for Windows
|
||
(deprecated since 2021).</li>
|
||
<li><a
|
||
href="https://github.com/diskuv/dkml-installer-ocaml#readme">Diskuv
|
||
OCaml</a> - Diskuv OCaml distribution for Windows.</li>
|
||
<li><a href="https://github.com/sagotch/makorel">makorel</a> – Release
|
||
OPAM packages easily.</li>
|
||
<li><a href="https://github.com/esy/esy">esy</a> - package.json workflow
|
||
for native development with Reason/OCaml.</li>
|
||
</ul></li>
|
||
<li><strong>Build Tools</strong>:
|
||
<ul>
|
||
<li><a href="https://github.com/ocaml/dune">dune</a> – A composable and
|
||
opinionated build system for OCaml (former jbuilder)</li>
|
||
<li><a href="http://oasis.forge.ocamlcore.org/">Oasis</a> - A tool to
|
||
integrate a configure, build and install system in your OCaml project.
|
||
It helps to create standard entry points in your build system and allows
|
||
external tools to analyse your project easily.
|
||
<ul>
|
||
<li><a href="https://github.com/ocaml/oasis2opam">oasis2opam</a> — Tool
|
||
to convert OASIS metadata to OPAM package descriptions.</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/ocaml-obuild/obuild">obuild</a> – Simple
|
||
package build system for ocaml.</li>
|
||
<li><a
|
||
href="https://github.com/mmottl/ocaml-makefile">ocaml-makefile</a> —
|
||
Easy to use Makefile for small to medium-sized OCaml-projects.</li>
|
||
<li><a href="https://github.com/dbuenzli/topkg">topkg</a> — OPAM-aware
|
||
packaging system using ocamlbuild.</li>
|
||
<li><a href="https://github.com/jin/rules_ocaml">Bazel</a> - OCaml rules
|
||
for <a href="https://bazel.build/">Bazel</a>, Google’s multi-language
|
||
and platform build tool.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="parallelism">Parallelism</h2>
|
||
<p>(<em>Note: Sorted from the easier to use to the more
|
||
flexible.</em>)</p>
|
||
<ul>
|
||
<li><strong>Libraries</strong>:
|
||
<ul>
|
||
<li><a href="http://rdicosmo.github.io/parmap/">Parmap</a> — Provides
|
||
easy-to-use parallel map and fold functions.</li>
|
||
<li><a href="https://github.com/mlin/forkwork">ForkWork</a> — A simple
|
||
library for forking child processes to perform work on multiple
|
||
cores.</li>
|
||
<li><a href="http://functory.lri.fr/About.html">Functory</a> — A
|
||
distributed computing library which facilitates distributed execution of
|
||
parallelizable computations in a seamless fashion.</li>
|
||
<li><a
|
||
href="https://github.com/janestreet/rpc_parallel">Rpc.Parallel</a> — A
|
||
library for spawning processes on a cluster of machines, and passing
|
||
typed messages between them.</li>
|
||
<li><a
|
||
href="http://projects.camlcity.org/projects/ocamlnet.html">Ocamlnet</a>
|
||
— An enhanced system platform library. Contains the
|
||
<code>netmulticore</code> library to compute tasks on as many cores of
|
||
the machine as needed.</li>
|
||
<li><a href="https://github.com/MyLifeLabs/nproc">Nproc</a> – Process
|
||
pool implementation for OCaml.</li>
|
||
<li><a href="https://github.com/UnixJunkie/parany">Parany</a> –
|
||
Parallelize computation over independent items, even if there is an
|
||
infinite number of them.</li>
|
||
<li><a href="http://sklml.inria.fr">Sklml</a> – Functional parallel
|
||
skeleton compiler and programming system for OCaml programs.</li>
|
||
<li><a href="https://github.com/mathiasbourgoin/SPOC">SPOC</a> -
|
||
Libraries and syntax extensions to offload intensive computations to
|
||
parallel accelerators (multicore CPUs, GPUs and other accelerators
|
||
compatible with GPGPU frameworks).</li>
|
||
</ul></li>
|
||
<li><strong>Articles</strong>:
|
||
<ul>
|
||
<li><a
|
||
href="https://stackoverflow.com/questions/6588500/what-is-the-state-of-ocamls-parallelization-abilities">What
|
||
is the state of OCaml’s parallelization abilities?</a></li>
|
||
<li><a
|
||
href="https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml">Parallel
|
||
programming in multicore OCaml</a></li>
|
||
<li><a
|
||
href="https://v2.ocaml.org/releases/5.0/htmlman/parallelism.html">Parallelism
|
||
programming</a> from the officiel OCaml manual</li>
|
||
<li><a
|
||
href="https://github.com/ocaml-multicore/awesome-multicore-ocaml">Awesome
|
||
multicore OCaml</a>. A compilation of resources</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="printers-helpers">Printers helpers</h2>
|
||
<ul>
|
||
<li>Reason’s native <a
|
||
href="https://github.com/reasonml/reason-native/tree/master/src/console#consoleloganything"><strong>Console.log</strong></a></li>
|
||
<li><a
|
||
href="https://github.com/mjambon/dum#readme"><strong>Dum</strong></a></li>
|
||
<li><a
|
||
href="https://github.com/krohrer/caml-inspect#readme"><strong>Inspect</strong></a></li>
|
||
<li><a
|
||
href="https://github.com/ocaml-ppx/ppx_deriving#usage"><strong>ppx_deriving</strong></a>’s
|
||
<code>[@@deriving show]</code>.</li>
|
||
<li><a
|
||
href="https://github.com/thierry-martinez/refl#basic-usage"><strong>refl</strong></a>,
|
||
a ppx_deriving-like.</li>
|
||
<li><a
|
||
href="https://github.com/LexiFi/lrt#getting-started"><strong>lrt</strong></a>,
|
||
another ppx_deriving-like.</li>
|
||
<li><a
|
||
href="https://github.com/pqwy/tpf#readme"><strong>tpf</strong></a>,
|
||
again a ppx_deriving-like.</li>
|
||
<li><a
|
||
href="https://github.com/janestreet/typerep"><strong>typerep</strong></a>,
|
||
probably a ppx_deriving-like with ppx_typerep_conv.</li>
|
||
<li><a
|
||
href="https://mirage.github.io/repr/repr/Repr/index.html#val-pp_json"><strong>repr</strong></a>,
|
||
which appears to have the user build the type representation manually
|
||
from combinators in addition to also having the user pass it where
|
||
needed.</li>
|
||
<li><a
|
||
href="https://gitlab.com/nomadic-labs/data-encoding/-/blob/master/src/tutorial.md#how-to-build-an-encoding"><strong>data-encoding</strong></a>,
|
||
also fully manual.</li>
|
||
<li><a
|
||
href="https://github.com/let-def/cmon#documentation"><strong>cmon</strong></a>,
|
||
fully manual.</li>
|
||
<li><a
|
||
href="https://github.com/ocaml/dune/blob/4b95cd3d1b3a62e69a9a9db2bc4af2f9fd2e56d8/otherlibs/dyn/dyn.mli"><strong>dyn</strong></a>
|
||
in Dune. It appears to also be fully manual.</li>
|
||
<li><a
|
||
href="https://github.com/progman1/genprintlib#readme"><strong>Genprint</strong></a></li>
|
||
<li><a
|
||
href="https://github.com/tsubame-sp/ocaml_at_p#readme"><strong>OCaml@p</strong></a></li>
|
||
</ul>
|
||
<h2 id="project-starter-templates">Project Starter Templates</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/OCamlPro/drom/">drom</a> - The drom tool
|
||
is a wrapper over opam/dune in an attempt to provide a cargo-like user
|
||
experience.</li>
|
||
<li><a href="https://github.com/tmattio/spin">spin</a> - Reason and
|
||
Ocaml project generator</li>
|
||
<li><a href="https://github.com/Khady/modern-ocaml">modern-ocaml</a> -
|
||
Template for an ocaml project with modern tooling</li>
|
||
</ul>
|
||
<h2 id="questions">Questions</h2>
|
||
<ul>
|
||
<li><a
|
||
href="https://stackoverflow.com/questions/14440531/ocaml-polymorphism-example-other-than-template-function">OCaml
|
||
polymorphism example other than template function?</a></li>
|
||
<li><a
|
||
href="https://stackoverflow.com/questions/7442449/ocaml-polymorphic-print-and-type-losing">OCaml
|
||
- polymorphic print and type losing</a></li>
|
||
</ul>
|
||
<h1 id="science-and-technical-computing">Science and Technical
|
||
Computing</h1>
|
||
<ul>
|
||
<li><a href="https://github.com/biocaml/biocaml">biocaml</a> – OCaml
|
||
Bioinformatics Library <a href="http://biocaml.org"
|
||
class="uri">http://biocaml.org</a>.</li>
|
||
<li><a href="https://github.com/pveber/bistro">bistro</a> – OCaml
|
||
library for building bioinformatics pipelines.</li>
|
||
<li><a href="https://mmottl.github.io/lacaml/">lacaml</a> - OCaml
|
||
bindings for BLAS/LAPACK (high-performance linear algebra Fortran
|
||
libraries).</li>
|
||
<li><a href="http://freux.fr/oss/obandit.html">obandit</a> - OCaml
|
||
library for multi-armed bandits.</li>
|
||
<li><a href="https://github.com/cheshire/onumerical">onumerical</a> –
|
||
Numerical library for OCaml.</li>
|
||
<li><a href="https://github.com/hammerlab/oml">oml</a> - OCaml library
|
||
for general numerical work.</li>
|
||
<li><a href="https://github.com/rleonid/ocephes">ocephes</a> - Bindings
|
||
to frequently used <code>C</code> special functions library.</li>
|
||
<li><a href="https://github.com/akabe/slap">slap</a> - A linear algebra
|
||
library in OCaml with type-based static size checking for matrix
|
||
operations.</li>
|
||
<li><a
|
||
href="https://github.com/LaurentMazare/tensorflow-ocaml">tensorflow-ocaml</a>
|
||
– OCaml bindings for TensorFlow.</li>
|
||
<li><a href="https://github.com/owlbarn/owl">owl</a> - OCaml numerical
|
||
library: dense and sparse matrix, linear algebra, regressions, maths and
|
||
stats functions.</li>
|
||
<li><a href="https://whizard.hepforge.org/">WHIZARD</a> - A system
|
||
designed for the efficient calculation of multi-particle scattering
|
||
cross sections and simulated event samples.</li>
|
||
</ul>
|
||
<h2 id="regular-expressions">Regular Expressions</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ocaml/ocaml-re">Re</a> – a pure OCaml
|
||
regular expressions library with combinators, supporting several formats
|
||
(glob, posix, str, etc.).</li>
|
||
<li><a href="https://github.com/mmottl/pcre-ocaml">ocaml-pcre</a> –
|
||
bindings to the PCRE library (perl-compatible regular expressions)</li>
|
||
<li><a href="https://github.com/rgrinberg/humane-re">Humane-re</a> –
|
||
Humane-re attempts to provide an easy interface for 90% of your regex
|
||
needs. Courtesy of ocaml-re.</li>
|
||
<li><a href="https://github.com/Drup/tyre">Tyre</a> - Tyre is a set of
|
||
combinators to build type-safe regular expressions, allowing automatic
|
||
extraction and modification of matched groups.</li>
|
||
</ul>
|
||
<h2 id="security-and-cryptography">Security and Cryptography</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/mirleft/ocaml-tls">ocaml-tls</a> – TLS
|
||
in pure OCaml.</li>
|
||
<li><a href="https://github.com/mirage/digestif">Digestif</a> - Hash
|
||
algorithms (like SHA* or BLAKE2*) in OCaml and C.</li>
|
||
<li><a href="https://github.com/xavierleroy/cryptokit">cryptokit</a> –
|
||
The Cryptokit library for OCaml provides a variety of cryptographic
|
||
primitives that can be used to implement cryptographic protocols in
|
||
security-sensitive applications.</li>
|
||
<li><a href="https://github.com/marcoonroad/nocoiner">nocoiner</a> - A
|
||
Commitment scheme library for Multi-party computations such as online
|
||
auctions and gambling.</li>
|
||
<li><a href="https://github.com/mirleft/ocaml-nocrypto">nocrypto</a> – A
|
||
small cryptographic library behind the ocaml-tls project. It is built to
|
||
be straightforward to use, adhere to functional programming principles,
|
||
and able to run in a Xen-based unikernel.</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>Note: The differences between <code>nocrypto</code> and
|
||
<code>cryptokit</code> cryptographic libraries are described in the
|
||
following blog post: <a
|
||
href="https://mirage.io/blog/introducing-nocrypto">OCaml-TLS: building
|
||
the nocrypto library core</a>.</p>
|
||
</blockquote>
|
||
<h2 id="semantic-technology">Semantic Technology</h2>
|
||
<ul>
|
||
<li><a href="https://framagit.org/zoggy/ocaml-rdf">OCaml-RDF</a> – OCaml
|
||
library to manipulate RDF graphs and execute Sparql queries.</li>
|
||
</ul>
|
||
<h2 id="serialization">Serialization</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ahrefs/atd">atdgen</a> — A serialization
|
||
compiler for multiple languages (OCaml, Java, Python, Scala, Typescript)
|
||
with a Binou or JSON format</li>
|
||
<li><a href="https://github.com/rgrinberg/bencode">bencode</a> — Bencode
|
||
(.torrent file format) reader/writer.</li>
|
||
<li><a href="https://github.com/mjambon/biniou">biniou</a> – Extensible
|
||
binary data format, like JSON but faster.</li>
|
||
<li><a href="https://github.com/ygrek/ocaml-cbor">cbor</a> — OCaml
|
||
native <a href="https://cbor.io/">CBOR</a> decoder/encoder.</li>
|
||
<li><a href="http://erratique.ch/software/jsonm">jsonm</a> —
|
||
Non-blocking streaming JSON codec for OCaml.</li>
|
||
<li><a href="http://erratique.ch/software/xmlm">xmlm</a> — A streaming
|
||
codec to decode and encode the XML data format.</li>
|
||
<li><a href="https://github.com/ocaml-community/yojson">yojson</a> — An
|
||
optimized parsing and printing library for the JSON format.</li>
|
||
<li><a href="https://github.com/janestreet/sexplib">sexplib</a> – A
|
||
S-expression parser and printer</li>
|
||
</ul>
|
||
<h2 id="system-programming">System Programming</h2>
|
||
<ul>
|
||
<li><p><a href="https://github.com/mirage/mirage">Mirage OS</a> – Mirage
|
||
is a programming framework for constructing secure, high-performance
|
||
network applications across a variety of cloud computing and mobile
|
||
platforms.</p></li>
|
||
<li><p><a href="https://github.com/mirage/ocaml-fat">ocaml-fat</a> –
|
||
Read and write FAT-format filesystems from OCaml.</p></li>
|
||
<li><p><a href="https://github.com/mirage/ocaml-git">ocaml-git</a> –
|
||
Pure OCaml low-level git bindings.</p></li>
|
||
<li><p><a href="https://github.com/mirage/ocaml-vchan">ocaml-vchan</a> –
|
||
Pure OCaml implementation of the “vchan” shared-memory communication
|
||
protocol.</p></li>
|
||
<li><p><strong>Embedded systems</strong></p>
|
||
<ul>
|
||
<li><a href="https://github.com/stevenvar/omicrob">OMicroB</a> - A
|
||
virtual machine designed to run OCaml bytecode on AVR (Arduino for
|
||
instance) micro-controlers.</li>
|
||
<li><a
|
||
href="http://www.algo-prog.info/ocapic/web/index.php?id=OCAPIC:OCAPIC">OCaPIC</a>
|
||
- An OCaml virtual machine for PIC18 micro-controlers.</li>
|
||
<li><a href="https://github.com/sadiqj/ocaml-esp32">ocaml-esp32</a> - A
|
||
compiler for ESP32 SoC.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="testing">Testing</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/mirage/alcotest">Alcotest</a> – A
|
||
lightweight and colourful test framework.</li>
|
||
<li><a href="http://ounit.forge.ocamlcore.org/">OUnit</a> – OUnit is a
|
||
unit test framework for OCaml. It allows one to easily create unit-tests
|
||
for OCaml code. It is based on HUnit, a unit testing framework for
|
||
Haskell.</li>
|
||
<li><a href="https://github.com/c-cube/qcheck">QCheck</a> — QCheck is a
|
||
property testing library inspired from Haskell’s QuickCheck</li>
|
||
<li><a href="https://github.com/vincent-hugot/iTeML">iTeML</a> (formerly
|
||
known as <a href="http://batteries.vhugot.com/qtest/">qtest</a>) —
|
||
supports inline pragma’s to generate tests.</li>
|
||
<li><a href="http://kaputt.x9c.fr/">Kaputt</a> — comprehensive testing
|
||
framework.</li>
|
||
<li><a
|
||
href="https://ocaml.janestreet.com/ocaml-core/111.28.00/doc/pa_test">Pa_test</a>
|
||
— General inline testing macro’s.</li>
|
||
<li><a href="https://github.com/hcarty/ocaml-testsimple">TestSimple</a>
|
||
- A lightweight unit testing framework compatible with the <a
|
||
href="https://testanything.org/">Test Anything Protocol</a>.</li>
|
||
<li><a href="https://github.com/janestreet/ppx_expect">expect-test</a> —
|
||
A framework for writing tests in OCaml, similar to <a
|
||
href="https://bitheap.org/cram/">Cram</a>, developed by <a
|
||
href="https://blog.janestreet.com/testing-with-expectations/">JaneStreet</a>.</li>
|
||
</ul>
|
||
<h2 id="utilities">Utilities</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/marcoonroad/ocaml-cuid">ocaml-cuid</a> -
|
||
Collision-resistant IDs for server scalability & database
|
||
performance.</li>
|
||
<li><a href="https://github.com/Axot017/validate">Validate</a> - PPX
|
||
deriver designed to streamline the process of validating records.</li>
|
||
<li><a href="https://erratique.ch/software/uuidm">Uuidm</a> - Uuidm is
|
||
an OCaml module implementing 128-bit universally unique identifiers
|
||
version 3, 5 (name based with MD5, SHA-1 hashing) and 4 (random based)
|
||
according to RFC 4122.</li>
|
||
<li><a href="https://github.com/sqids/sqids-ocaml">sqids-ocaml</a> -
|
||
Official OCaml port of Sqids. Generate short unique IDs from
|
||
numbers.</li>
|
||
</ul>
|
||
<h2 id="web-development">Web Development</h2>
|
||
<ul>
|
||
<li><strong>Frameworks</strong>:
|
||
<ul>
|
||
<li><a href="https://github.com/rgrinberg/opium">Opium</a> – Sinatra
|
||
like web toolkit for OCaml.</li>
|
||
<li><a href="http://ocsigen.org/eliom/">Ocsigen Eliom</a> – Eliom is a
|
||
full-featured multi-tier framework, for developing multi-platform Web
|
||
and mobile apps as 100% OCaml distributed applications. It can also be
|
||
used for more traditional Web or mobile apps: Web sites, single page
|
||
applications, REST API, etc.</li>
|
||
<li><a href="https://aantron.github.io/dream/">Dream</a> - Tidy Web
|
||
framework for OCaml and ReasonML</li>
|
||
<li><a
|
||
href="https://github.com/inhabitedtype/ocaml-webmachine">webmachine</a>
|
||
– A REST toolkit for OCaml. OCaml webmachine is a layer on top of cohttp
|
||
that implements a state-machine-based HTTP request processor. It’s
|
||
particularly well-suited for writing RESTful APIs. As the name suggests,
|
||
this is an OCaml port of the webmachine project.</li>
|
||
<li><a href="https://github.com/janestreet/incr_dom">incr_dom</a> - A
|
||
library for building dynamic webapps, using Js_of_ocaml</li>
|
||
<li><a
|
||
href="https://hbr.github.io/fmlib/odoc/fmlib_browser/doc_overview.html">fmlib_browser</a>
|
||
- a library which helps to write web applications which run in the
|
||
browser in a pure functional style.</li>
|
||
<li><a href="https://github.com/LexiFi/ocaml-vdom">ocaml-vdom</a> - Elm
|
||
architecture and (V)DOM for OCaml</li>
|
||
</ul></li>
|
||
<li><strong>Tools</strong>:
|
||
<ul>
|
||
<li><a href="https://github.com/mirage/ocaml-cow">COW</a> – Caml on the
|
||
Web (COW) is a set of parsers and syntax extensions to let you
|
||
manipulate HTML, CSS, XML, JSON and Markdown directly from OCaml
|
||
code.</li>
|
||
<li><a
|
||
href="http://projects.camlcity.org/projects/ocamlnet.html">Ocamlnet</a>
|
||
has many relevant web libraries — <a
|
||
href="http://projects.camlcity.org/projects/dl/ocamlnet-4.0.4/doc/html-main/Nethtml.html">Nethtml</a>
|
||
html parser, <a
|
||
href="http://projects.camlcity.org/projects/dl/ocamlnet-4.0.4/doc/html-main/Netasn1.html">Netasn1</a>
|
||
for ASN.1 parsing, <a
|
||
href="http://projects.camlcity.org/projects/dl/ocamlnet-4.0.4/doc/html-main/Netencoding.html">Netencoding</a>
|
||
for Base64, Quoted Printable, URL encoding and HTML escaping, <a
|
||
href="http://projects.camlcity.org/projects/dl/ocamlnet-4.0.4/doc/html-main/Netmime.html">Netmime</a>
|
||
for MIME processing, etc. See the <a
|
||
href="http://projects.camlcity.org/projects/dl/ocamlnet-4.0.4/doc/html-main/index.html">list
|
||
of modules</a> in Ocamlnet’s manual.</li>
|
||
<li><a href="http://ocsigen.org/tyxml">tyxml</a> — Library to build
|
||
valid (according to the W3C spec) Html and Svg trees.</li>
|
||
<li><a href="http://ocsigen.org/js_of_ocaml">js_of_ocaml</a> –
|
||
Js_of_ocaml is a compiler of OCaml bytecode to Javascript. It makes it
|
||
possible to run Ocaml programs in a Web browser.
|
||
<ul>
|
||
<li><a
|
||
href="https://github.com/AngryLawyer/commonjs_of_ocaml">commonjs_of_ocaml</a>
|
||
- Easily import and export CommonJS modules from a js_of_ocaml
|
||
project.</li>
|
||
</ul></li>
|
||
<li><a href="https://rescript-lang.org/">ReScript</a> - ReScript is a
|
||
robustly typed language that compiles to efficient and human-readable
|
||
JavaScript.</li>
|
||
<li><a href="https://github.com/mirage/ocaml-uri">ocaml-uri</a> –
|
||
RFC3986 URI parsing library.</li>
|
||
<li><a href="https://github.com/klakplok/goji">Goji</a> – An OCaml
|
||
bindings generator for JavaScript libraries.</li>
|
||
<li><a href="https://github.com/Cumulus/Syndic">Syndic</a> – RSS and
|
||
Atom feed parsing</li>
|
||
<li><a
|
||
href="https://github.com/rgrinberg/ocaml-mustache">ocaml-mustache</a> –
|
||
mustache.js logic-less templates in OCaml.</li>
|
||
<li><a href="https://github.com/barko/atdjs">atdjs</a> – atd code
|
||
generator (serialization) for OCaml/js_of_ocaml.</li>
|
||
<li><a href="https://github.com/tategakibunko/jingoo">jingoo</a> – OCaml
|
||
template engine almost compatible with jinja2.</li>
|
||
<li><a
|
||
href="https://github.com/inhabitedtype/ocaml-dispatch">dispatch</a> –
|
||
Path-based dispatching for client- and server-side applications.</li>
|
||
<li><a href="https://github.com/aantron/lambda-soup">Lambda Soup</a> -
|
||
Functional HTML scraping and manipulation with CSS selectors, à la
|
||
Python’s Beautiful Soup.</li>
|
||
<li><a href="https://github.com/aantron/markup.ml">Markup.ml</a> -
|
||
Error-recovering streaming HTML5 and XML parsers, serializers.</li>
|
||
<li><a href="https://github.com/LexiFi/gen_js_api">gen_js_api</a> -
|
||
gen_js_api aims at simplifying the creation of OCaml bindings for
|
||
Javascript libraries.</li>
|
||
<li><a href="https://github.com/anuragsoni/routes">routes</a> - Typed
|
||
routes for OCaml/ReasonML web applications.</li>
|
||
</ul></li>
|
||
<li><strong>Open Source Projects</strong>:
|
||
<ul>
|
||
<li><a href="https://github.com/Cumulus/Cumulus">Cumulus</a> – Hacker
|
||
news like website with the OCaml framework Ocsigen</li>
|
||
</ul></li>
|
||
</ul>
|
||
<hr />
|
||
<p><em>Inspired by awesome projects line. Discover <a
|
||
href="https://github.com/bayandin/awesome-awesomeness">more
|
||
awesomeness</a> :sparkles:.</em></p>
|
||
<p><a href="https://github.com/ocaml-community/awesome-ocaml">ocaml.md
|
||
Github</a></p>
|