Hello Here is the latest OCaml Weekly News, for the week of December 06 to 13, 2022.
Table of Contents ───────────────── Status update: Bazel-enabled OCaml toolchain First release candidate for OCaml 5.0.0 First release candidate for OCaml 4.14.1 Stable Diffusion in OCaml qcheck-lin and qcheck-stm 0.1.0 Accelerating zk-SNARKs on FPGAs with Hardcaml ppx_expjs: transparently export OCaml values to JavaScript First public release of OCaml-Canvas 1.0 Release of Seqes version 0.1 Batteries v3.6.0 Old CWN Status update: Bazel-enabled OCaml toolchain ════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/status-update-bazel-enabled-ocaml-toolchain/10892/1> Gregg Reynolds announced ──────────────────────── [https://github.com/obazl-repository/ocamlcc] From the readme: • New name: ocamlcc - the OCaml Compiler Collection. Analogous to GCC, the GNU Compiler Collection. Not only do we have multiple compilers - ocamlc.byte, ocamlopt.byte, etc., the compilers themselves may serve to drive a C toolchain, to compile, assemble, and link C code. • Platforms and toolchains have been revised to support recursive (staged) builds. • Recursive builds. Well, at least quasi-recursive. There is only one target for building a compiler, bin:ocamlcc; to build the compiler, this target needs a compiler, which it gets from a toolchain, which depends on bin:ocamlc, which needs a compiler, … recursively, until we get to the base case, the precompiled boot/ocamlc compiler. So the boot compiler (boot/ocamlc) builds the stage 1 compiler which builds the stage 2 compiler which builds the stage 3 compiler. See Staged builds. • Revised configuration logic. The goal is to eliminate dependency on autotools (./configure). This is very much a Work-In-Progress; the code is in //config. For more info see notes/autoconf. • Use the link command from the Bazel CC toolchain. OBazl now uses information from the cc toolchain selected (and configured) by Bazel to set the command string used by OCaml to run the C linker (Config.mkexe). For more info see ocaml_cc_config and notes/linking. [TODO: same thing for the assemble command Config.asm] • Revised preprocessing. OBazl eliminates shell scripts and tools, instead using a template engine written in portable C to generate code. In other words, this version includes some stuff beyond just getting the Bazel build to work, in particular concerning configuration and preprocessing. Part of the motivation there is to pave the way to Windows support by eliminating dependency on Unix-ish stuff. Maintainers of the Makefiles may be interested in some of that stuff. Using templates for code generation instead of sh, awk, sed, etc. The template engine is written in portable C. Personally I find that using templates simplifies things considerably. Feedback always welcome. The issue tracker is enabled on the github repo, and a discourse server is at <https://discord.gg/wZCSq2nq6y>. [https://github.com/obazl-repository/ocamlcc] <https://github.com/obazl-repository/ocamlcc> First release candidate for OCaml 5.0.0 ═══════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/first-release-candidate-for-ocaml-5-0-0/10922/1> octachron announced ─────────────────── The release of OCaml version 5.0.0 is imminent. As a final step before the release, we are publishing a release candidate that you can test while waiting for the release in the upcoming weeks. If you find any bugs, please report them here: <https://github.com/ocaml/ocaml/issues> Compared to the second beta release, this release contains one toplevel bug fix and a minor type system fix. If you are interested by the bug fixes beyond the new multicore runtime, the full change log for OCaml 5.0.0 is available at: <https://github.com/ocaml/ocaml/blob/5.0/Changes> A short summary of the two changes since the second beta release is also available below. This release candidate will be followed shortly by a release candidate for OCaml 4.14.1 . This updated minor version for OCaml 4.14 will mirror the safe bug fixes from the OCaml 5.0 branch. Installation instructions ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ The base compiler can be installed as an opam switch with the following commands on opam 2.1: ┌──── │ opam update │ opam switch create 5.0.0~rc1 └──── For previous version of opam, the switch creation command line is slightly more verbose: ┌──── │ opam update │ opam switch create 5.0.0~rc1 --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git └──── It might be also interesting to check the new support for parallelism by installing the domainslib library with ┌──── │ opam install domainslib └──── The source code for the release candidate is available at these addresses: • <https://github.com/ocaml/ocaml/archive/5.0.0-rc1.tar.gz> • <https://caml.inria.fr/pub/distrib/ocaml-5.0/ocaml-5.0.0~rc1.tar.gz> ◊ Fine-tuned compiler configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: ┌──── │ opam update │ opam switch create <switch_name> ocaml-variants.5.0.0~rc1+options <option_list> └──── where `<option_list>' is a comma separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: ┌──── │ opam switch create 5.0.0~rc1+flambda+nffa ocaml-variants.5.0.0~rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array └──── The command line above is slightly more complicated for opam versions anterior to 2.1: ┌──── │ opam update │ opam switch create <switch_name> --packages=ocaml-variants.5.0.0~rc1+options,<option_list> │ --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git └──── In both cases, all available options can be listed with “opam search ocaml-option”. Changes since the second beta release ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ◊ Bug fixes • [11776]: Extend environment with functor parameters in `strengthen_lazy`. (Chris Casinghino and Luke Maurer, review by Gabriel Scherer) • [11533], [11534]: follow synonyms again in #show_module_type (this had stopped working in 4.14.0) (Gabriel Scherer, review by Jacques Garrigue, report by Yaron Minsky) [11776] <https://github.com/ocaml/ocaml/issues/11776> [11533] <https://github.com/ocaml/ocaml/issues/11533> [11534] <https://github.com/ocaml/ocaml/issues/11534> First release candidate for OCaml 4.14.1 ════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/first-release-candidate-for-ocaml-4-14-1/10929/1> octachron announced ─────────────────── The release of OCaml version 4.14.1 is (also) imminent. This companion release to the OCaml 5.0.0 release will backport many safe bug fixes from the currently experimental 5.0 branch to the stable 4.14 branch. A full list of bug fixes is available below. In order to ensure that the future release works as expected, we are testing a release candidate during the upcoming weeks. If you find any bugs, please report them here: <https://github.com/ocaml/ocaml/issues> Installation Instructions ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ The base compiler can be installed as an opam switch with the following commands on opam 2.1: ┌──── │ opam update │ opam switch create 4.14.1~rc1 └──── For previous version of opam, the switch creation command line is slightly more verbose: ┌──── │ opam update │ opam switch create 4.14.1~rc1 --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git └──── It might be also interesting to check the new support for parallelism by installing the `domainslib` library with ┌──── │ opam install domainslib └──── The source code for the release candidate is available at these addresses: • <https://github.com/ocaml/ocaml/archive/4.14.1-rc1.tar.gz> • <https://caml.inria.fr/pub/distrib/ocaml-5.0/ocaml-4.14.1~rc1.tar.gz> ◊ Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: ┌──── │ opam update │ opam switch create <switch_name> ocaml-variants.4.14.1~rc1+options <option_list> └──── where `<option_list>' is a comma-separated list of `ocaml-option-*' packages. For instance, for a `flambda' and `no-flat-float-array' switch: ┌──── │ opam switch create 4.14.1~rc1+flambda+nffa ocaml-variants.4.14.1~rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array └──── The command line above is slightly more complicated for opam versions before 2.1: ┌──── │ opam update │ opam switch create <switch_name> --packages=ocaml-variants.4.14.1~rc1+options,<option_list> │ --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git └──── In both cases, all available options can be listed with `opam search ocaml-option'. Changes Since OCaml 4.14.0 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ◊ Compiler user-interface and warnings: • [#11184], [#11670]: Stop calling ranlib on created / installed libraries (Sébastien Hinderer and Xavier Leroy, review by the same) [#11184] <https://github.com/ocaml/ocaml/issues/11184> [#11670] <https://github.com/ocaml/ocaml/issues/11670> ◊ Build System: • [#11370], [#11373]: Don’t pass CFLAGS to flexlink during configure. (David Allsopp, report by William Hu, review by Xavier Leroy and Sébastien Hinderer) • [#11487]: Thwart FMA test optimization during configure (William Hu, review by David Allsopp and Sébastien Hinderer) [#11370] <https://github.com/ocaml/ocaml/issues/11370> [#11373] <https://github.com/ocaml/ocaml/issues/11373> [#11487] <https://github.com/ocaml/ocaml/issues/11487> ◊ Bug Fixes: • [#10768], [#11340]: Fix typechecking regression when combining first class modules and GADTs. (Jacques Garrigue, report by François Thiré, review by Matthew Ryan) • [#11204]: Fix regression introduced in 4.14.0 that would trigger Warning 17 when calling virtual methods introduced by constraining the self type from within the class definition. (Nicolás Ojeda Bär, review by Leo White) • [#11263], [#11267]: caml/{memory,misc}.h: check whether `_MSC_VER' is defined before using it to ensure that the headers can always be used in code which turns on -Wundef (or equivalent). (David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and Sébastien Hinderer) • [#11314], [#11416]: fix non-informative error message for module inclusion (Florian Angeletti, report by Thierry Martinez, review by Gabriel Scherer) • [#11358], [#11379]: Refactor the initialization of bytecode threading, This avoids a “dangling pointer” warning of GCC 12.1. (Xavier Leroy, report by Armaël Guéneau, review by Gabriel Scherer) • [#11387], module type with constraints no longer crash the compiler in presence of both shadowing warnings and the `-bin-annot' compiler flag. (Florian Angeletti, report by Christophe Raffalli, review by Gabriel Scherer) • [#11392], [#11392]: assertion failure with -rectypes and external definitions (Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev) • [#11417]: Fix regression allowing virtual methods in non-virtual classes. (Leo White, review by Florian Angeletti) • [#11468]: Fix regression from [#10186] (OCaml 4.13) detecting IPv6 on Windows for mingw-w64 i686 port. (David Allsopp, review by Xavier Leroy and Sébastien Hinderer) • [#11489], [#11496]: More prudent deallocation of alternate signal stack (Xavier Leroy, report by @rajdakin, review by Florian Angeletti) • [#11516], [#11524]: Fix the `deprecated_mutable' attribute. (Chris Casinghino, review by Nicolás Ojeda Bär and Florian Angeletti) • [#11194], [#11609]: Fix inconsistent type variable names in “unbound type var” messages (Ulysse Gérard and Florian Angeletti, review Florian Angeletti and Gabriel Scherer) • [#11622]: Prevent stack overflow when printing a constructor or record mismatch error involving recursive types. (Florian Angeletti, review by Gabriel Scherer) • [#11732]: Ensure that types from packed modules are always generalised (Stephen Dolan and Leo White, review by Jacques Garrigue) • [#11737]: Fix segfault condition in Unix.stat under Windows in the presence of multiple threads. (Marc Lasson, Nicolás Ojeda Bär, review by Gabriel Scherer and David Allsopp) • [#11776]: Extend environment with functor parameters in `strengthen_lazy'. (Chris Casinghino and Luke Maurer, review by Gabriel Scherer) • [#11533], [#11534]: follow synonyms again in #show_module_type (this had stopped working in 4.14.0) (Gabriel Scherer, review by Jacques Garrigue, report by Yaron Minsky) • [#11768], [#11788]: Fix crash at start-up of bytecode programs in no-naked-pointers mode caused by wrong initialization of caml_global_data (Xavier Leroy, report by Etienne Millon, review by Gabriel Scherer) [#10768] <https://github.com/ocaml/ocaml/issues/10768> [#11340] <https://github.com/ocaml/ocaml/issues/11340> [#11204] <https://github.com/ocaml/ocaml/issues/11204> [#11263] <https://github.com/ocaml/ocaml/issues/11263> [#11267] <https://github.com/ocaml/ocaml/issues/11267> [#11314] <https://github.com/ocaml/ocaml/issues/11314> [#11416] <https://github.com/ocaml/ocaml/issues/11416> [#11358] <https://github.com/ocaml/ocaml/issues/11358> [#11379] <https://github.com/ocaml/ocaml/issues/11379> [#11387] <https://github.com/ocaml/ocaml/issues/11387> [#11392] <https://github.com/ocaml/ocaml/issues/11392> [#11417] <https://github.com/ocaml/ocaml/issues/11417> [#11468] <https://github.com/ocaml/ocaml/issues/11468> [#10186] <https://github.com/ocaml/ocaml/issues/10186> [#11489] <https://github.com/ocaml/ocaml/issues/11489> [#11496] <https://github.com/ocaml/ocaml/issues/11496> [#11516] <https://github.com/ocaml/ocaml/issues/11516> [#11524] <https://github.com/ocaml/ocaml/issues/11524> [#11194] <https://github.com/ocaml/ocaml/issues/11194> [#11609] <https://github.com/ocaml/ocaml/issues/11609> [#11622] <https://github.com/ocaml/ocaml/issues/11622> [#11732] <https://github.com/ocaml/ocaml/issues/11732> [#11737] <https://github.com/ocaml/ocaml/issues/11737> [#11776] <https://github.com/ocaml/ocaml/issues/11776> [#11533] <https://github.com/ocaml/ocaml/issues/11533> [#11534] <https://github.com/ocaml/ocaml/issues/11534> [#11768] <https://github.com/ocaml/ocaml/issues/11768> [#11788] <https://github.com/ocaml/ocaml/issues/11788> Stable Diffusion in OCaml ═════════════════════════ Archive: <https://discuss.ocaml.org/t/stable-diffusion-in-ocaml/10932/1> Arul announced ────────────── I ported over Stable Diffusion in OCaml as I tried to learn the internals of stable diffusion. So far, it has been a smooth process to run deep learning models in OCaml. `ocaml-torch' library is pretty neat! <https://github.com/ArulselvanMadhavan/diffusers-ocaml> Comments/Feedbacks/Issues - welcome! qcheck-lin and qcheck-stm 0.1.0 ═══════════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-qcheck-lin-and-qcheck-stm-0-1-0/10933/1> Jan Midtgaard announced ─────────────────────── We are happy to announce the release of two new opam packages: `qcheck-lin' and `qcheck-stm' for black-box property-based testing of module interfaces under parallel usage. Both these libraries build on top of `QCheck' - hence their names. • `qcheck-lin' requires little more than an interface description. It allows to test a library for sequential consistency, that is, whether results obtained from using it in parallel agree with some linear, single domain execution. • `qcheck-stm' is a model-based, state-machine framework for both sequential and parallel testing. It allows to test an imperative interface against a pure model description, and thereby allows to express and test intended behaviour beyond a signature description. We presented preliminary work on both these libraries at the OCaml Workshop 2022 earlier this year. The libraries furthermore underlie our work to test the new multicore runtime of OCaml 5.0, and have helped us identify a number of issues. More information is available from the GitHub repository: <https://github.com/ocaml-multicore/multicoretests> Happy multicore testing! Edwin Török then said ───────────────────── Interesting, this looks like a nice addition to my testing “toolbox”. I’ve been using all of `crowbar', `qcstm', `monolith' and each has its own strenghts (what sparked my interest was in fact the presentation about `qcstm' from an earlier ICFP): • `monolith': • :heavy_plus_sign: is like `qcstm' but integrates with `afl' with speeds up finding bugs a lot on multicore machines • :heavy_minus_sign: it doesn’t integrate nicely with testcase shrinking (you *can* use `afl-tmin' but there is a bit of additional machinery to integrate all that into an efficient bugfinding cycle) • `qcstm': • :heavy_plus_sign: comparison with a reference implementation • :heavy_plus_sign: shrinking helps produce understandable and actionable bugreports • :heavy_minus_sign: doesn’t integrate with `afl', so once you’ve run out of the low hanging fruit to fix it takes longer to find more bugs • `crowbar' • :heavy_plus_sign: integrates with `afl' • :heavy_minus_sign: lacks the state machine exploration/reference implementation comparison that `monolith' and `qcstm' provide I haven’t tried it yet, but `qcheck-stm' looks like a nice evolution of `qcstm' that addresses one of its disadvantages compared to `crowbar~/~monolith': the lack of parallelization. Could you please clarify the connection between `qcstm' and `qcheck-stm' though? I see the README reference `qcstm' and some of the authors are shared, however the new `qcheck-stm' has a lower version number than the old `qcstm'. Based on “ `STM' contains a revision of [qcstm]” I’d assume that qcheck-stm is a superset of qcstm, and qcstm is deprecated in favour of qcheck-stm? FWIW both `qcstm' and `monolith' have helped discover some bugs and security issues in `oxenstored' (the ocaml implementation of ’xenstored’ in Xen) a few years ago. My initial intent was to compare against a reference implementation, not specifically to look for security bugs, and the first bug found was a regular bug: • <https://xenbits.xen.org/gitweb/?p=xen.git;a=commit;h=c8b96708252a436da44005307f7c195d699bd7c5> However fairly quickly a combination of fuzzing, stress testing and manual code review has spotted a large number of security bugs, some very obvious: • [XSA-353 permissions not checked on root node] • [XSA-352 oxenstored: node ownership can be changed by unprivileged clients] • [XSA-330 oxenstored memory leak in reset_watches] • [XSA-354 XAPI: guest-triggered excessive memory usage] `qcstm~/~monolith' didn’t find these bugs directly, at least not initially, but they pointed out enough suspicious behaviour in that code area that tweaking the fuzzer would then find the security bug seen via manual review. If it wasn’t for <https://icfp20.sigplan.org/details/ocaml-2020-papers/2/A-Simple-State-Machine-Framework-for-Property-Based-Testing-in-OCaml> then a lot of these (security) bugs wouldn’t have been found, so thanks for helping me improve the quality of `oxenstored'! [qcstm] <https://github.com/jmid/qcstm> [XSA-353 permissions not checked on root node] <https://xenbits.xen.org/xsa/advisory-353.html> [XSA-352 oxenstored: node ownership can be changed by unprivileged clients] <https://xenbits.xen.org/xsa/advisory-352.html> [XSA-330 oxenstored memory leak in reset_watches] <https://xenbits.xen.org/xsa/advisory-330.html> [XSA-354 XAPI: guest-triggered excessive memory usage] <https://xenbits.xen.org/xsa/advisory-354.html> Jan Midtgaard replied ───────────────────── Thanks for your kind feedback Edwin. I didn’t know of any real `qcstm' users so you’ve made my day! :smiley: `qcheck-stm' is indeed intended as a replacement of `qcstm', which was missing the ability to run parallel tests. The interfaces required are largely the same, except we’ve had to split `qcstm'’s `run_cmd' into two separate operations `run' and `postcond' in `qcheck-stm' in order to make parallel testing work. It should therefore be relatively easy to port tests from `qcstm' to `qcheck-stm'. We did so ourselves for some of the example `qcstm' `Stdlib' tests to stress test the standard library under parallel usage with OCaml 5. `qcheck-stm' and `qcstm' are (as you point out) based on black-box property-based testing - whereas `crowbar' and `monolith' are coverage-driven (“grey-box”) driven by AFL-instrumentation. Each of these have their advantages as you also point out. In the present case, the black-box approach was relatively easy to get to work with non-deterministic parallel code in the style of [Erlang’s QuickCheck]( <https://publications.lib.chalmers.se/records/fulltext/125252/local_125252.pdf>) and [its derivatives]. In the longer term, I’m hoping that we can (eventually) unite these efforts in a full-featured, common testing library for OCaml :smiley::crossed_fingers: [its derivatives] <https://github.com/jmid/pbt-frameworks> Accelerating zk-SNARKs on FPGAs with Hardcaml ═════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/accelerating-zk-snarks-on-fpgas-with-hardcaml/10934/1> Fu Yong Quah announced ────────────────────── @andyman, Ben Devlin, @rahuly and myself (@fyquah95) recently competed in the [ZPrize competition] in our free time. We used [Hardcaml] to create our submissions, and we we came first and second in two of the competition tracks! All source code is [open source at github]. A big motivation for joining the contest was to increase the amount of publicly available open source Hardcaml examples. Using Hardcaml enabled us to productively create large FPGA designs with competitive performance in the short time-frame of the competition. We have a blog post with an overview of our work: <https://blog.janestreet.com/zero-knowledge-fpgas-hardcaml/> We also have a much more technical write-up with details about methods, results and build instructions: <https://zprize.hardcaml.com> We also developed a small web frontend made with Js_of_ocaml and Brr to showcase our designs in the browser. Our frontend allows users to configure their designs, download RTL, view statistics, run simulations, and even view waveforms from the comfort of their browser (even on your phone!). Source code is available at <https://github.com/hardcamls/hardcaml_web>. (Special thanks to @TyOverby for helping us put this together.) <https://zprize.hardcaml.com/apps/ntt/ntt-core-with-rams-app> [ZPrize competition] <https://www.zprize.io/blog/announcing-zprize-results> [Hardcaml] <http://hardcaml.com> [open source at github] <https://github.com/fyquah/hardcaml_zprize> ppx_expjs: transparently export OCaml values to JavaScript ══════════════════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-ppx-expjs-transparently-export-ocaml-values-to-javascript/10938/1> Zach Baylin announced ───────────────────── I’d like to share a ppx I’ve been working on to help us build frontends with JSOO at Skolem as well as a blog post to accompany it. [ppx_expjs] is a ppx that helps generate the boilerplate of exporting OCaml values (including functions) to JavaScript when using Js_of_ocaml. [ppx_expjs] <https://github.com/skolemlabs/ppx_expjs> Example ╌╌╌╌╌╌╌ `my_module.ml': ┌──── │ let concat (s1 : string) (s2 : string) : string = s1 ^ s2 │ [@@expjs] └──── `node': ┌──── │ Welcome to Node.js v16.13.0. │ Type ".help" for more information. │ > const my_module = require("./_build/default/my_module.bc.js"); │ undefined │ > x.concat("Hello ", "World") │ "Hello World" └──── (note there is no need to use either `Js.string' nor `Js.to_string') Blog post ╌╌╌╌╌╌╌╌╌ I’ve written a blog post that describes why one might find this ppx useful and how it works, which can be found [here]. [here] <https://blog.skolem.com/ppx_expjs-generate-transparent-javascript-from-your-ocaml/> Installation ╌╌╌╌╌╌╌╌╌╌╌╌ Currently there’s no official release of the ppx on OPAM, but if you would like to install it you can run ┌──── │ opam pin add ppx_expjs https://github.com/skolemlabs/ppx_expjs.git └──── First public release of OCaml-Canvas 1.0 ════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/first-public-release-of-ocaml-canvas-1-0/10945/1> OCamlPro announced ────────────────── We are proud to announce the first public release of OCaml-Canvas 1.0! <https://ocamlpro.github.io/ocaml-canvas/> OCaml-Canvas provides canvases to do interactive vector graphics in OCaml, using native implementations (Windows, Macos, X11) and a web-backend (Javascript), with a programming interface similar to HTML5 canvases. Compared to the Graphics library, it provides a larger API, a web backend, and native Windows and Macos backends (with Cocoa API, instead of XQuartz). To sum up, OCaml-Canvas focuses on: • maximizing portability : OCaml-Canvas works natively under Linux (X11 and soon Wayland), macOS and Windows, and also provides a Javascript backend; • minimizing dependencies: the native backends make use of as few dependencies as possible; • improving aesthetics: OCaml-Canvas supports OpenType and TrueType fonts and anti-aliasing; OCaml-Canvas is already available on Opam: <https://opam.ocaml.org/packages/ocaml-canvas/> A quick tutorial is available on <https://ocamlpro.github.io/ocaml-canvas/sphinx/quickstart.html> The complete documentation is available on <https://ocamlpro.github.io/ocaml-canvas/> Hope this will be useful to the community ! Release of Seqes version 0.1 ════════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-release-of-seqes-version-0-1/10947/1> Raphaël Proust announced ──────────────────────── Release ╌╌╌╌╌╌╌ I am happy to announce the release of `Seqes', a library to combine `Seq' and monads. The bulk of the initial development happened during the mirage-os retreat, with a few rounds of API design, test suite expansion, and documentation writing afterwards. The package is released under LGPL with linking exception (it is based on code from the OCaml’s Stdlib). The code is [hosted on Gitlab]. It is available through opam: `opam install seqes'. The library is fully usable and has a comprehensive `QCheck'-based test coverage, but the interface may change in the future (see follow-up thread with its typing puzzle). [hosted on Gitlab] <https://gitlab.com/nomadic-labs/seqes> Uses and examples ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ The `Seq' module does not mix well with monads. This is why in `Lwt' the `Lwt_seq' module defines its own `Stdlib.Seq.t'-like type — whereas the `Lwt_list' module simply defines some functions around the `Stdlib.List.t' type. In addition, the `Seq' module has grown a lot between OCaml 4.13 and 4.14. This makes the maintenance of `Seq'-like modules (in the style of `Lwt_seq') difficult. The `Seqes' library addresses this by providing a functor to generate `Lwt_seq'-like modules but for any monad. There are two main functors, *Extending the `Stdlib.Seq' module*: ┌──── │ module Seq │ : sig │ │ (* The whole of the Seq module from Stdlib *) │ include module type of struct include Stdlib.Seq end │ │ (* Additional Lwt traversors *) │ module S : Seqes.Sigs.SEQMON1TRAVERSORS │ with type 'a mon := 'a Lwt.t │ with type 'a callermon := 'a Lwt.t │ with type 'a t := 'a Stdlib.Seq.t │ │ end │ = struct │ include Stdlib.Seq │ module S = Seqes.Standard.Make1(Lwt) │ end └──── This extended module let’s you traverse the Stdlib sequences with Lwt functions. ┌──── │ Seq.exists Lwt_unix.file_exists filename_sequence └──── *Making a new monad-friendly type* ┌──── │ module SeqS │ : sig │ │ (* Similar to [Stdlib.Seq] but with [Lwt] baked into the sequence type. *) │ include Seqes.Sigs.SEQMON1ALL │ with type 'a mon := 'a Lwt.t │ │ (* Additional Lwt helpers. E.g., [M.map : ('a -> 'b Lwt.t) -> 'a t -> 'b t]. *) │ module M : │ Seqes.Sigs.SEQMON1TRANSFORMERS │ with type 'a mon := 'a Lwt.t │ with type 'a callermon := 'a Lwt.t │ with type 'a t := 'a t │ │ end │ = Seqes.Monadic.Make1(Lwt) └──── This module has its own `Seq'-like type but with the Lwt monad built-in. ┌──── │ type 'a t = unit -> 'a node Lwt.t └──── Batteries v3.6.0 ════════════════ Archive: <https://discuss.ocaml.org/t/batteries-v3-6-0/10953/1> UnixJunkie announced ──────────────────── The latest release of batteries landed in <https://github.com/ocaml/opam-repository>. It is compatible with ocaml-5. The change log can be seen below: v3.6.0 (minor release) ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ • BatBuffer.enum rewritten to work with OCaml-5 (Francois Berenger) • Fix ’make doc’ #1097 (Simmo Saan) • Remove dependence to oasis #1095 (Simmo Saan) • Fix compilation and unit tests for OCaml 5.0.0 #1094 #1087 #1086 (Simmo Saan, Francois Berenger) • Bug correction in BatString.split_on_string #1089 (Francois Berenger, report by Lucas Franceschino) • bug correction in BatBitset.inter #1091 (report by Yongho Yoon, fix by Gabriel Scherer) • Support new OCaml 5 unix primitive names #1082 (David Allsopp, review by Francois Berenger) • BatRandom.choice on an empty enum now throws Empty instead of Invalid_argument “Random.int” previously #1080 (Nicolas Tollenaere, review by Francois Berenger) Many thanks to all contributors. Old CWN ═══════ If you happen to miss a CWN, you can [send me a message] and I’ll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] <mailto:alan.schm...@polytechnique.org> [the archive] <https://alan.petitepomme.net/cwn/> [RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss> [online] <http://lists.idyll.org/listinfo/caml-news-weekly/> [Alan Schmitt] <https://alan.petitepomme.net/>
_______________________________________________ caml-news-weekly mailing list caml-news-weekly@lists.idyll.org http://lists.idyll.org/listinfo/caml-news-weekly