Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt <[email protected]> Tue, 31 Mar 2026 08:10:20 +0200
| Newsgroups | gmane.comp.lang.caml.inria |
|---|---|
| Message-ID | <[email protected]> |
--===-=-=
Content-Type: multipart/mixed; boundary="=-=-="
--=-=-=
Content-Type: multipart/alternative; boundary="==-=-="
--==-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Hello
Here is the latest OCaml Weekly News, for the week of March 24 to 31,
2026.
Table of Contents
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80
Improve signature-help feature in Merlin
Feedback Wanted: Upcoming OCaml Users Survey 2026 Questions
OCaml Users Survey 2023 Results
ortac-0.8 specification-driven testing with Domains
Third alpha release for OCaml 5.5.0
ocaml-openapi-gen 0.1.0, ocaml-forgejo
CS6868 Concurrent Programming =E2=80=93 Course Materials
libinput - OCaml bindings for Linux input devices
OCaml compiler office hours
Old CWN
Improve signature-help feature in Merlin
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-improve-signature-help-feature-in-merlin=
/17920/1>
Charl=C3=A8ne_Gros announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
We, at Tarides, are very happy to announce some improvements made to
Merlin=E2=80=99s `signature-help' feature!
As a reminder, `signature-help' is a feature in Merlin that displays
the function signature and highlights the active parameter. In the
editor, this is typically displayed in a tooltip, floating window, or
minibuffer. For instance, the following image displays the
`signature-help' for the function `exec_prog' in VSCode.
<https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/4/46e99c=
5c69bab991b8dd6a6a7494db5c2f32e07b.png>
The implementation of the signature-help command had a few
shortcomings, which have been fixed. These fixes are making the
feature way more pleasant to use. Some of these improvements are
already part of the last Merlin and ocaml-lsp releases, others will be
included in the next release.
Results:
=E2=80=A2 Merlin only displays `signature-help' information on the functi=
on
parameters and no longer displays it on the function name.
=E2=80=A2 `signature-help' displays the function's information only for t=
he
active parameters, and no longer loops back to highlight the first
parameter after the last one.
=E2=80=A2 `signature-help' is now triggered even if used inside a `let ..=
in'
binding, in which the `in' is not yet written after the function
call
=E2=80=A2 The optional parameters are now detected and highlighted when t=
he
active parameter starts writing one.
Feedback Wanted: Upcoming OCaml Users Survey 2026 Questions
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90
Archive:
<https://discuss.ocaml.org/t/feedback-wanted-upcoming-ocaml-users-survey-=
2026-questions/17925/1>
Sabine Schmaltz announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Hi everyone, I am preparing the OCaml Users Survey 2026 on behalf of
the OCSF and would like your input on the survey questions before we
finalize them.
You can find the proposed question list here: [Proposed OCaml Users
Survey Questions 2026] For reference, there is a [summary of the
changes compared to the 2023 survey].
[Proposed OCaml Users Survey Questions 2026]
<https://hackmd.io/3i-d6wgYRy2uVhqIVbxzNg>
[summary of the changes compared to the 2023 survey]
<https://hackmd.io/@sabine-s/BkVG6DWibg>
Summary of proposed changes since the 2023 survey
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C
New sections:
=E2=80=A2 AI/LLM Usage (4 questions) - Do you use AI/LLM tools for OCaml
development? Which ones? What for?
=E2=80=A2 Debugging & Profiling (3 questions) - What debugging approaches=
and
tools do you use? What are the biggest challenges? (Motivated by
frequent mentions of debugging difficulties in the 2023 free-text
responses.)
New standalone questions:
=E2=80=A2 Community size preference ("I wish the community was=E2=80=A6")
=E2=80=A2 Documentation tools used (odoc, ocamldoc, etc.)
=E2=80=A2 Dedicated free-text fields for tooling and package repository
feedback
Removed questions (10 total) - questions that yielded
low-actionability data or were redundant, including: largest project
size, release schedule satisfaction, source hosting platform, web
deployment platforms, "OCaml tooling provides a comfortable workflow
for me", "OCaml libraries are stable enough", "software written in
OCaml is easy to maintain", and the language feature wishlist (effect
handlers have shipped in OCaml 5).
Modified questions - new answer options reflecting ecosystem
evolution: OxCaml, Zig, Helix, Zed, WebAssembly targets, dune package
management, Nix-based builds, Bluesky, and AI/LLM-related options in
the "burning desires" section. Old compiler versions (4.02-4.06)
collapsed into "=E2=89=A44.07". Benchmarking tools now listed by specific=
name
rather than category.
We'd love your feedback on:
=E2=80=A2 Are there questions you think should be added or removed?
=E2=80=A2 Are any answer options missing?
=E2=80=A2 Are there new topics that are important to the OCaml community =
that
we should ask about?
=E2=80=A2 Is the survey too long, too short, or about right at 58 questio=
ns?
Thank you for helping us make the survey as useful as possible!
:two_hump_camel: :orange_heart:
Sabine
PS: See also [the results of the OCaml Users Survey 2023]!
[the results of the OCaml Users Survey 2023]
<https://discuss.ocaml.org/t/ann-ocaml-users-survey-2023-results/17926>
OCaml Users Survey 2023 Results
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-ocaml-users-survey-2023-results/17926/1>
Sabine Schmaltz announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Hi everyone,
on behalf of the OCSF, I am happy to announce the (belated) report on
the responses to the OCaml Users Survey 2023. We apologize for the
delay in evaluating and are committed to run the OCaml Users Survey
reliably in a yearly fashion from now on.
Without further ceremony, here is the link to the report:
<https://ocaml-sf.org/docs/2023/survey-results.html>
We welcome any feedback on the report, discussion around the responses
and numbers (please share your interpretations and opinions), or other
commentary.
Thank you to everyone who participated in the survey to help us better
understand the state of OCaml and its ecosystem! :orange_heart:
:two_hump_camel:
Sabine
PS: the 2026 OCaml Users Survey is coming up. We greatly value your
input on [the feedback thread about 2026 survey question changes].
[the feedback thread about 2026 survey question changes]
<https://discuss.ocaml.org/t/feedback-wanted-upcoming-ocaml-users-survey-20=
26-questions/17925/1>
ortac-0.8 specification-driven testing with Domains
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-ortac-0-8-specification-driven-testing-w=
ith-domains/17927/1>
Nicolas Osborne announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Hi! We, at Tarides, are very excited to announce the release of
ortac-0.8.0 for specification-driven testing!
`ortac' is a tool in the [Gospel] ecosystem. The core idea is to
translate a subset of the Gospel specification language into OCaml
code and use these translations to generate runtime checking.
`ortac' has a plugin architecture. You can install it via opam:
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
=E2=94=82 $ opam install ortac-wrapper # install the wrapper plugin fo=
r runtime assertion checking, with all the other necessary parts (runtime a=
nd cli)
=E2=94=82 $ opam install ortac-qcheck-stm # install the qcheck-stm plugin=
that generates QCheck-STM tests, with all the other necessary parts (runti=
me and cli)
=E2=94=82 $ opam install ortac-dune # install the dune plugin to ge=
nerate dune boilerplate to use the two previous plugins
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
This release focuses on making Ortac/QCheck-STM take advantage of more
features from the QCheck-STM test framework: namely testing in a
parallel context and flexibility of the command generation.
You can take a look at the [documentation] that explains how it works.
Regarding testing in a parallel context, with the introduction of the
bug report feature in version 0.2 and the coverage of SUT-returning
functions in version 0.4, it was not possible anymore to easily
generate QCheck-STM tests in a parallel context (which is quite easy
in hand-written QCheck-STM tests). This is now fixed!
Information for the bug report are partly collected in the function
doing the actual testing (comparing the results from the actual run
and the results from the model). This means that implementing the bug
report feature for the parallel testing requires to rewrite this
function, which is the heart of QCheck-STM+Domains and what we are
trusting when running the tests (the Trusted Testing Base if you
will). In order to check that we keep the same behaviour, that the
generated tests have the same semantic as corresponding hand-written
QCheck-STM tests, we minimized the diff of the [commit] introducing
the collection of the information so that the preservation of the
logic is apparent (at the end of the day, human review is what we
trust).
Since version 0.4, SUT-returning functions are included in the
tests. The newly created SUT is then added to the store of SUTs that
are picked as argument for the next calls. The question here is what
to do with them in a parallel context: We can't add a SUT created in a
parallel branch in a global store, as it is not supposed to be shared
between domains. We've chosen a simple design, where we stop storing
newly created SUTs once we are in a parallel context. No worries,
these SUT-returning functions will still be fully tested in the
sequential part of the testing (in sequential mode and/or in the
sequential prefix of the parallel mode).
One of the power of the QCheck-STM test framework is the flexibility
of its command generator. This flexibility comes from the `QCheck.Gen'
API itself and from the fact that the QCheck-STM command generator is
parameterized over the state of the current model (think generation of
a `lookup' command for a key-value store, you want to be able to have
a chance to generate a call that lookup a key that is actually
associated to a value). An automatically generated command generator
ought to be a bit naive. In order to mitigate this naivet=C3=A9, we allow
the user to provide:
=E2=80=A2 weights to be applied to specific command generation, usefull f=
or
example to disable the generation of the `push' command on a [work
stealing queue] on the domain that is not supposed to own the queue.
=E2=80=A2 complete command generator implementation when the user wants to
take advantage on the command generator being parameterized over the
current state of the model.
Happy testing!
[Gospel] <https://github.com/ocaml-gospel>
[documentation]
<https://ocaml-gospel.github.io/ortac/ortac-qcheck-stm/index.html>
[commit]
<https://github.com/ocaml-gospel/ortac/commit/ef8d598ccbd6c9987648e201ebffb=
6abb5a3d610>
[work stealing queue]
<https://ocaml-multicore.github.io/saturn/saturn/Saturn/Work_stealing_deque=
/index.html#val-push>
Third alpha release for OCaml 5.5.0
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/third-alpha-release-for-ocaml-5-5-0/17928/1>
octachron announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80
With the progress of the ongoing stabilisation effort for OCaml 5.5.0,
we are happy to announce a third alpha release for OCaml 5.5.0.
The missing second alpha was unreleased due to an unforeseen
interaction between the relocatable compiler and bootstrapping. This
issue is fixed in this third alpha.
Beyond this important change, compared to the first alpha this new
alpha release contains
=E2=80=A2 two code generation fixes
=E2=80=A2 three type system fixes
=E2=80=A2 one standard library fix
(see the Changelog below for a full list).
Overall, it looks like 5.5.0 is stabilizing quite well and alpha
versions of most development tools are available. Thus we are planning
to switch to a beta release in the beginning of April.
More precisely, the ongoing progress on stabilising the ecosystem is
tracked on the [5.5.0 readiness meta-issueon opam].
There is also a companion alpha opam repository available for this
alpha release
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
=E2=94=82 $ opam repo add alpha git+https://github.com/kit-ty-kate/opam-a=
lpha-repository.git
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80
which contains in-progress alpha releases of opam packages that are
being updated for OCaml 5.5.0 .
The final release is still planned for between May and June.
If you find any bugs, please report them on the [issue tracker].
If you are interested by the full list of new features and bug fixes,
the updated [changelog for OCaml 5.5.0] is available.
Happy hacking, Florian Angeletti for the OCaml team
[5.5.0 readiness meta-issueon opam]
<https://github.com/ocaml/opam-repository/issues/29463>
[issue tracker] <https://github.com/ocaml/ocaml/issues>
[changelog for OCaml 5.5.0]
<https://github.com/ocaml/ocaml/blob/5.5/Changes>
Changes compared to the first alpha
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C
=E2=97=8A Compiler artefact fixes
=E2=80=A2 More bootstrap-friendly relocatable compiler
=E2=80=A2 A bootstrap to fix compiler-libs related issues reported by
js_of_ocaml
=E2=97=8A Code generation bug fixes
=E2=80=A2 [#14583]: fix bug in linear scan spilling heuristic that in cer=
tain
situations could lead to miscompilations. (Nicol=C3=A1s Ojeda B=C3=A4r,
review by Vincent Laviron)
=E2=80=A2 [#13693], [#14514]: s390x: fix heap corruption with
libasmrun_shared.so caused by PLT lazy binding trampoline saving
FPRs into OCaml's fiber stack. Replace PLT calls with GOT-indirect
calls in the s390x code emitter. (Zane Hambly, review by David
Allsopp and Xavier Leroy)
[#14583] <https://github.com/ocaml/ocaml/issues/14583>
[#13693] <https://github.com/ocaml/ocaml/issues/13693>
[#14514] <https://github.com/ocaml/ocaml/issues/14514>
=E2=97=8A Type system bug fixes
=E2=80=A2 [#14434], [#14652]: Protect check_counter_example_pat against
polymorphic types, restoring type soundness. (Stephen Dolan and
Jacques Garrigue, report and review by Alistair O'Brien)
=E2=80=A2 [#14603], [#14604]: avoid Ctype.apply failures when mixing
polymorphic types and unboxed constructors. (Gabriel Scherer and
Stefan Muenzel, report by Brandon Stride, review by Florian
Angeletti)
=E2=80=A2 [#14626], [#14675]: take in account module-dependent functions =
when
determining if an optional argument is non-erasable. (Alistair
O'Brien and Florian Angeletti, review by Gabriel Scherer)
[#14434] <https://github.com/ocaml/ocaml/issues/14434>
[#14652] <https://github.com/ocaml/ocaml/issues/14652>
[#14603] <https://github.com/ocaml/ocaml/issues/14603>
[#14604] <https://github.com/ocaml/ocaml/issues/14604>
[#14626] <https://github.com/ocaml/ocaml/issues/14626>
[#14675] <https://github.com/ocaml/ocaml/issues/14675>
=E2=97=8A Standard library fix
=E2=80=A2 [#14635]: Fix a bug in `caml_floatarray_gather' that would caus=
e the
result of `Float.Array.sub', `Float.Array.append',
`Float.Array.concat' (when empty) not to be equal to `[||]'. (Marc
Lasson, review by Gabriel Scherer)
[#14635] <https://github.com/ocaml/ocaml/issues/14635>
=E2=97=8A Documentation update
=E2=80=A2 [#13590]: Document automatic command-line expansion of `*' and =
`?'
wildcards by the runtime under Windows. (Benjamin Sigonneau, review
by Nicol=C3=A1s Ojeda B=C3=A4r)
[#13590] <https://github.com/ocaml/ocaml/issues/13590>
ocaml-openapi-gen 0.1.0, ocaml-forgejo
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-ocaml-openapi-gen-0-1-0-ocaml-forgejo/17=
929/1>
Zoggy announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
Hello,
I just made a first release of [ocaml-openapi-gen], a tool generating
code from an [openapis] specification.
The `openapi_gen' package is available from my [personal opam
repository].
This tool is used to generate code for [ocaml-forgejo], a library to
interact with Codeberg and other forgejo-based platforms through the
[provided REST API].
The generated interfaces way evolve in the future.
[ocaml-openapi-gen] <https://zoggy.frama.io/openapi/>
[openapis] <https://www.openapis.org/>
[personal opam repository] <https://framagit.org/zoggy/opam-repository>
[ocaml-forgejo] <https://zoggy.frama.io/ocaml-forgejo/>
[provided REST API] <https://codeberg.org/api/swagger#/>
CS6868 Concurrent Programming =E2=80=93 Course Materials
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-cs6868-concurrent-programming-course-mat=
erials/17932/1>
KC Sivaramakrishnan announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80
I=E2=80=99m currently teaching a course called =E2=80=9CCS6868: Concurrent
Programming=E2=80=9D at IIT Madras. The goal of the course is to teach
concurrent and parallel programming using OCaml 5, and then introduce
[OxCaml] for safe and fast parallelism. I=E2=80=99ve covered the OCaml 5
parts, and will be starting OxCaml next. I thought it would be good to
share the course materials with the community.
<https://github.com/kayceesrk/cs6868_s26>
CS6868 assumes knowledge of OCaml, which I cover in [CS3100: Paradigms
of Programming]. This course includes a [YouTube playlist] with all
the lectures, notebooks, and assignments.
CS6868 builds the foundations of parallelism, reasoning about
correctness through linearizability, parallel programming through spin
locks, mutexes, condition variables, memory consistency models, and
the basics of performance and non-blocking data structures (lock-free
linked lists, queues, and stacks). Here, the course closely follows
the book [The Art of Multiprocessor Programming]. All the code has
been redone in OCaml 5. In addition to the book content, the course
also covers the OCaml relaxed memory model. We also cover a fair bit
of OCaml-specific tools here, including concurrent property-based
testing using [qcheck-lin and qcheck-stm], and [data race detection
using TSAN].
Following this, the course covers the basics of effect handlers,
following specific parts of [Control structures in programming
languages: from goto to algebraic effects]. We then build a
full-fledged Go-like, multicore-capable concurrent programming library
with lightweight threads, buffered channels, selective communication
(in the vein of [Concurrent ML]), nested parallel programming (as in
[domainslib]), and basic asynchronous IO (as in [Eio]).
There is a growing collection of [course projects], which should be
doable if you=E2=80=99ve gone through the course materials. Let me know i=
f you
have ideas for course projects.
The course tries to bring together the content from [many] [tutorials]
[we] [have] done in the past. Let me know if you have feedback. I=E2=80=
=99m
open to accepting PRs fixing small issues, but given that this is an
ongoing course, any large PRs will likely not be accepted. I hope you
will enjoy working through this as much as I had fun making it.
[OxCaml] <https://oxcaml.org/>
[CS3100: Paradigms of Programming]
<https://github.com/kayceesrk/cs3100_m20>
[YouTube playlist]
<https://www.youtube.com/watch?v=3D9R8Oim7YU20&list=3DPLt0HgEXFOHdkE-NTs87s=
7QjwYwqeihb-D>
[The Art of Multiprocessor Programming]
<https://shop.elsevier.com/books/the-art-of-multiprocessor-programming/herl=
ihy/978-0-12-415950-1>
[qcheck-lin and qcheck-stm]
<https://github.com/ocaml-multicore/multicoretests/>
[data race detection using TSAN]
<https://ocaml.org/manual/5.3/tsan.html>
[Control structures in programming languages: from goto to algebraic
effects] <https://xavierleroy.org/control-structures/>
[Concurrent ML] <https://en.wikipedia.org/wiki/Concurrent_ML>
[domainslib] <https://github.com/ocaml-multicore/domainslib>
[Eio] <https://github.com/ocaml-multicore/eio>
[course projects]
<https://github.com/kayceesrk/cs6868_s26/blob/main/project_ideas.md>
[many] <https://github.com/ocaml-multicore/ocaml-effects-tutorial>
[tutorials]
<https://github.com/ocaml-multicore/ocaml5-parallelism-tutorial>
[we]
<https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml>
[have] <https://github.com/ocaml-multicore/effects-examples>
libinput - OCaml bindings for Linux input devices
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ann-libinput-ocaml-bindings-for-linux-input-=
devices/17933/1>
Thomas Leonard announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
I'm pleased to announce the first release of [libinput-ocaml] (OCaml
bindings for the libinput C library).
libinput is used by applications such as Wayland compositors to access
mice, keyboards, touch pads, etc.
[Linux input devices (with libinput-ocaml)] explains how input devices
work on Linux, and shows how to use the library to create a little
game:
<https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/8/87988f=
00d0f601de559c15f736118a8928c54664.png>
[libinput-ocaml] <https://github.com/talex5/libinput-ocaml>
[Linux input devices (with libinput-ocaml)]
<https://roscidus.com/blog/blog/2026/03/28/input-devices/>
OCaml compiler office hours
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90
Archive:
<https://discuss.ocaml.org/t/ocaml-compiler-office-hours/17230/32>
Continuing this thread, gasche announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80
I propose to hold OCaml compiler office hours on Friday April 3d,
11:00-12:00 UTC (in local time, [date-range from=3D2026-04-03T11:00:00
to=3D2026-04-03T12:00:00 timezone=3DUTC].)
=E2=80=A2 [collaborative pad to prepare questions/topics]
[collaborative pad to prepare questions/topics]
<https://notes.irif.fr/ncfgJV9KRRGE5HUxvaKFww#>
Old CWN
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90
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
to the [caml-list].
[Alan Schmitt]
[send me a message] <mailto:[email protected]>
[the archive] <https://alan.petitepomme.net/cwn/>
[RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss>
[caml-list] <https://sympa.inria.fr/sympa/info/caml-list>
[Alan Schmitt] <https://alan.petitepomme.net/>
--==-=-=
Content-Type: text/html; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en" xml:lang=3D"en">
<head>
<!-- 2026-03-31 Tue 08:08 -->
<meta http-equiv=3D"Content-Type" content=3D"text/html;charset=3Dutf-8" />
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=3D1"=
/>
<title>OCaml Weekly News</title>
<meta name=3D"generator" content=3D"Org Mode" />
<style type=3D"text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-c:before { content: 'C'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'JavaScript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<style type=3D"text/css">#table-of-contents h2 { display: none } .title { d=
isplay: none } .authorname { text-align: right }</style>
<style type=3D"text/css">.outline-2 {border-top: 1px solid black;}</style>
</head>
<body>
<div id=3D"content" class=3D"content">
<h1 class=3D"title">OCaml Weekly News</h1>
<p>
<a href=3D"https://alan.petitepomme.net/cwn/2026.03.24.html">Previous Week<=
/a> <a href=3D"https://alan.petitepomme.net/cwn/index.html">Up</a> <a href=
=3D"https://alan.petitepomme.net/cwn/2026.04.07.html">Next Week</a>
</p>
<p>
Hello
</p>
<p>
Here is the latest OCaml Weekly News, for the week of March 24 to 31, 2026.
</p>
<div id=3D"table-of-contents" role=3D"doc-toc">
<h2>Table of Contents</h2>
<div id=3D"text-table-of-contents" role=3D"doc-toc">
<ul>
<li><a href=3D"#1">Improve signature-help feature in Merlin</a></li>
<li><a href=3D"#2">Feedback Wanted: Upcoming OCaml Users Survey 2026 Questi=
ons</a></li>
<li><a href=3D"#3">OCaml Users Survey 2023 Results</a></li>
<li><a href=3D"#4">ortac-0.8 specification-driven testing with Domains</a><=
/li>
<li><a href=3D"#5">Third alpha release for OCaml 5.5.0</a></li>
<li><a href=3D"#6">ocaml-openapi-gen 0.1.0, ocaml-forgejo</a></li>
<li><a href=3D"#7">CS6868 Concurrent Programming – Course Materials</=
a></li>
<li><a href=3D"#8">libinput - OCaml bindings for Linux input devices</a></l=
i>
<li><a href=3D"#9">OCaml compiler office hours</a></li>
<li><a href=3D"#orgc48a691">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Improve signature-help feature in Merlin</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-improve-signature-help-=
feature-in-merlin/17920/1">https://discuss.ocaml.org/t/ann-improve-signatur=
e-help-feature-in-merlin/17920/1</a>
</p>
</div>
<div id=3D"outline-container-orgbb9ae28" class=3D"outline-3">
<h3 id=3D"orgbb9ae28">Charl=C3=A8ne_Gros announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgbb9ae28">
<p>
We, at Tarides, are very happy to announce some improvements made to Merlin=
=E2=80=99s <code>signature-help</code> feature!
</p>
<p>
As a reminder, <code>signature-help</code> is a feature in Merlin that disp=
lays the function signature and highlights the active parameter. In the edi=
tor, this is typically displayed in a tooltip, floating window, or minibuff=
er. For instance, the following image displays the <code>signature-help</co=
de> for the function <code>exec_prog</code> in VSCode.
</p>
<div id=3D"org1902b23" class=3D"figure">
<p><img src=3D"https://us1.discourse-cdn.com/flex020/uploads/ocaml/original=
/2X/4/46e99c5c69bab991b8dd6a6a7494db5c2f32e07b.png" alt=3D"46e99c5c69bab991=
b8dd6a6a7494db5c2f32e07b.png" width=3D"80%" />
</p>
</div>
<p>
The implementation of the signature-help command had a few shortcomings, wh=
ich have been fixed. These fixes are making the feature way more pleasant t=
o use. Some of these improvements are already part of the last Merlin and o=
caml-lsp releases, others will be included in the next release.
</p>
<p>
Results:
</p>
<ul class=3D"org-ul">
<li>Merlin only displays <code>signature-help</code> information on the fun=
ction parameters and no longer displays it on the function name.</li>
<li><code>signature-help</code> displays the function's information only fo=
r the active parameters, and no longer loops back to highlight the first pa=
rameter after the last one.</li>
<li><code>signature-help</code> is now triggered even if used inside a <cod=
e>let .. in</code> binding, in which the <code>in</code> is not yet written=
after the function call</li>
<li>The optional parameters are now detected and highlighted when the activ=
e parameter starts writing one.</li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">Feedback Wanted: Upcoming OCaml Users Survey 2026 Questions</h=
2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/feedback-wanted-upcoming-oc=
aml-users-survey-2026-questions/17925/1">https://discuss.ocaml.org/t/feedba=
ck-wanted-upcoming-ocaml-users-survey-2026-questions/17925/1</a>
</p>
</div>
<div id=3D"outline-container-org95f3c20" class=3D"outline-3">
<h3 id=3D"org95f3c20">Sabine Schmaltz announced</h3>
<div class=3D"outline-text-3" id=3D"text-org95f3c20">
<p>
Hi everyone,=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
I am preparing the OCaml Users Survey 2026 on behalf of the OCSF and woul=
d like your input on the survey questions before we finalize them.
</p>
<p>
You can find the proposed question list here: <a href=3D"https://hackmd.io/=
3i-d6wgYRy2uVhqIVbxzNg">Proposed OCaml Users Survey Questions 2026</a>=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
For reference, there is a <a href=3D"https://hackmd.io/@sabine-s/BkVG6DWibg=
">summary of the changes compared to the 2023 survey</a>.=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20
</p>
</div>
<div id=3D"outline-container-orgdbc883b" class=3D"outline-4">
<h4 id=3D"orgdbc883b">Summary of proposed changes since the 2023 survey</h4>
<div class=3D"outline-text-4" id=3D"text-orgdbc883b">
<p>
New sections:
</p>
<ul class=3D"org-ul">
<li>AI/LLM Usage (4 questions) - Do you use AI/LLM tools for OCaml developm=
ent? Which ones? What for?</li>
<li>Debugging & Profiling (3 questions) - What debugging approaches and=
tools do you use? What are the biggest challenges? (Motivated by frequent =
mentions of debugging difficulties in the 2023 free-text responses.)</li>
</ul>
<p>
New standalone questions:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
</p>
<ul class=3D"org-ul">
<li>Community size preference ("I wish the community was…")</li>
<li>Documentation tools used (odoc, ocamldoc, etc.)</li>
<li>Dedicated free-text fields for tooling and package repository feedback<=
/li>
</ul>
<p>
Removed questions (10 total) - questions that yielded low-actionability dat=
a or were redundant, including: largest project size, release schedule sati=
sfaction, source hosting platform, web deployment platforms, "OCaml tooling=
provides a comfortable workflow for me", "OCaml libraries are stable enoug=
h", "software written in OCaml is easy to maintain", and the language featu=
re wishlist (effect handlers have shipped in OCaml 5).=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20
</p>
<p>
Modified questions - new answer options reflecting ecosystem evolution: OxC=
aml, Zig, Helix, Zed, WebAssembly targets, dune package management, Nix-bas=
ed builds, Bluesky, and AI/LLM-related options in the "burning desires" sec=
tion. Old compiler versions (4.02-4.06) collapsed into "=E2=89=A44.07". Ben=
chmarking tools now listed by specific name rather than category.
</p>
<p>
We'd love your feedback on:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
</p>
<ul class=3D"org-ul">
<li>Are there questions you think should be added or removed?</li>
<li>Are any answer options missing?</li>
<li>Are there new topics that are important to the OCaml community that we =
should ask about?</li>
<li>Is the survey too long, too short, or about right at 58 questions?</li>
</ul>
<p>
Thank you for helping us make the survey as useful as possible! :two_hump_c=
amel: :orange_heart:=20
</p>
<p>
Sabine
</p>
<p>
PS: See also <a href=3D"https://discuss.ocaml.org/t/ann-ocaml-users-survey-=
2023-results/17926">the results of the OCaml Users Survey 2023</a>!
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">OCaml Users Survey 2023 Results</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ocaml-users-survey-2023=
-results/17926/1">https://discuss.ocaml.org/t/ann-ocaml-users-survey-2023-r=
esults/17926/1</a>
</p>
</div>
<div id=3D"outline-container-orge484df3" class=3D"outline-3">
<h3 id=3D"orge484df3">Sabine Schmaltz announced</h3>
<div class=3D"outline-text-3" id=3D"text-orge484df3">
<p>
Hi everyone,
</p>
<p>
on behalf of the OCSF, I am happy to announce the (belated) report on the r=
esponses to the OCaml Users Survey 2023. We apologize for the delay in eval=
uating and are committed to run the OCaml Users Survey reliably in a yearly=
fashion from now on.
</p>
<p>
Without further ceremony, here is the link to the report:
</p>
<p>
<a href=3D"https://ocaml-sf.org/docs/2023/survey-results.html">https://ocam=
l-sf.org/docs/2023/survey-results.html</a>
</p>
<p>
We welcome any feedback on the report, discussion around the responses and =
numbers (please share your interpretations and opinions), or other commenta=
ry.
</p>
<p>
Thank you to everyone who participated in the survey to help us better unde=
rstand the state of OCaml and its ecosystem! :orange_heart: :two_hump_camel=
:=20
</p>
<p>
Sabine
</p>
<p>
PS: the 2026 OCaml Users Survey is coming up. We greatly value your input o=
n <a href=3D"https://discuss.ocaml.org/t/feedback-wanted-upcoming-ocaml-use=
rs-survey-2026-questions/17925/1">the feedback thread about 2026 survey que=
stion changes</a>.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">ortac-0.8 specification-driven testing with Domains</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ortac-0-8-specification=
-driven-testing-with-domains/17927/1">https://discuss.ocaml.org/t/ann-ortac=
-0-8-specification-driven-testing-with-domains/17927/1</a>
</p>
</div>
<div id=3D"outline-container-org5baf658" class=3D"outline-3">
<h3 id=3D"org5baf658">Nicolas Osborne announced</h3>
<div class=3D"outline-text-3" id=3D"text-org5baf658">
<p>
Hi! We, at Tarides, are very excited to announce the release of ortac-0.8.0=
for specification-driven testing!
</p>
<p>
<code>ortac</code> is a tool in the <a href=3D"https://github.com/ocaml-gos=
pel">Gospel</a> ecosystem. The core idea is to translate a subset of the Go=
spel specification language into OCaml code and use these translations to g=
enerate runtime checking.
</p>
<p>
<code>ortac</code> has a plugin architecture. You can install it via opam:
</p>
<pre class=3D"example" id=3D"org50b53ec">
$ opam install ortac-wrapper # install the wrapper plugin for runtime as=
sertion checking, with all the other necessary parts (runtime and cli)
$ opam install ortac-qcheck-stm # install the qcheck-stm plugin that genera=
tes QCheck-STM tests, with all the other necessary parts (runtime and cli)
$ opam install ortac-dune # install the dune plugin to generate dune =
boilerplate to use the two previous plugins
</pre>
<p>
This release focuses on making Ortac/QCheck-STM take advantage of more feat=
ures from the QCheck-STM test framework: namely testing in a parallel conte=
xt and flexibility of the command generation.
</p>
<p>
You can take a look at the <a href=3D"https://ocaml-gospel.github.io/ortac/=
ortac-qcheck-stm/index.html">documentation</a> that explains how it works.
</p>
<p>
Regarding testing in a parallel context, with the introduction of the bug r=
eport feature in version 0.2 and the coverage of SUT-returning functions in=
version 0.4, it was not possible anymore to easily generate QCheck-STM tes=
ts in a parallel context (which is quite easy in hand-written QCheck-STM te=
sts). This is now fixed!
</p>
<p>
Information for the bug report are partly collected in the function doing t=
he actual testing (comparing the results from the actual run and the result=
s from the model). This means that implementing the bug report feature for =
the parallel testing requires to rewrite this function, which is the heart =
of QCheck-STM+Domains and what we are trusting when running the tests (the =
Trusted Testing Base if you will). In order to check that we keep the same =
behaviour, that the generated tests have the same semantic as corresponding=
hand-written QCheck-STM tests, we minimized the diff of the <a href=3D"htt=
ps://github.com/ocaml-gospel/ortac/commit/ef8d598ccbd6c9987648e201ebffb6abb=
5a3d610">commit</a> introducing the collection of the information so that t=
he preservation of the logic is apparent (at the end of the day, human revi=
ew is what we trust).
</p>
<p>
Since version 0.4, SUT-returning functions are included in the tests. The n=
ewly created SUT is then added to the store of SUTs that are picked as argu=
ment for the next calls. The question here is what to do with them in a par=
allel context: We can't add a SUT created in a parallel branch in a global =
store, as it is not supposed to be shared between domains. We've chosen a s=
imple design, where we stop storing newly created SUTs once we are in a par=
allel context. No worries, these SUT-returning functions will still be full=
y tested in the sequential part of the testing (in sequential mode and/or i=
n the sequential prefix of the parallel mode).
</p>
<p>
One of the power of the QCheck-STM test framework is the flexibility of its=
command generator. This flexibility comes from the <code>QCheck.Gen</code>=
API itself and from the fact that the QCheck-STM command generator is para=
meterized over the state of the current model (think generation of a <code>=
lookup</code> command for a key-value store, you want to be able to have a =
chance to generate a call that lookup a key that is actually associated to =
a value). An automatically generated command generator ought to be a bit na=
ive. In order to mitigate this naivet=C3=A9, we allow the user to provide:
</p>
<ul class=3D"org-ul">
<li>weights to be applied to specific command generation, usefull for examp=
le to disable the generation of the <code>push</code> command on a <a href=
=3D"https://ocaml-multicore.github.io/saturn/saturn/Saturn/Work_stealing_de=
que/index.html#val-push">work stealing queue</a> on the domain that is not =
supposed to own the queue.</li>
<li>complete command generator implementation when the user wants to take a=
dvantage on the command generator being parameterized over the current stat=
e of the model.</li>
</ul>
<p>
Happy testing!
</p>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">Third alpha release for OCaml 5.5.0</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/third-alpha-release-for-oca=
ml-5-5-0/17928/1">https://discuss.ocaml.org/t/third-alpha-release-for-ocaml=
-5-5-0/17928/1</a>
</p>
</div>
<div id=3D"outline-container-org3218e54" class=3D"outline-3">
<h3 id=3D"org3218e54">octachron announced</h3>
<div class=3D"outline-text-3" id=3D"text-org3218e54">
<p>
With the progress of the ongoing stabilisation effort for OCaml 5.5.0, we a=
re happy to announce a third alpha release for OCaml 5.5.0.
</p>
<p>
The missing second alpha was unreleased due to an unforeseen interaction be=
tween the relocatable compiler and bootstrapping. This issue is fixed in th=
is third alpha.
</p>
<p>
Beyond this important change, compared to the first alpha this new alpha re=
lease contains=20
</p>
<ul class=3D"org-ul">
<li>two code generation fixes</li>
<li>three type system fixes</li>
<li>one standard library fix</li>
</ul>
<p>
(see the Changelog below for a full list).
</p>
<p>
Overall, it looks like 5.5.0 is stabilizing quite well and alpha versions o=
f most development tools are available. Thus we are planning to switch to a=
beta release in the beginning of April.
</p>
<p>
More precisely, the ongoing progress on stabilising the ecosystem is tracke=
d on the <a href=3D"https://github.com/ocaml/opam-repository/issues/29463">=
5.5.0 readiness meta-issueon opam</a>.
</p>
<p>
There is also a companion alpha opam repository available for this alpha re=
lease
</p>
<pre class=3D"example" id=3D"orgb16844d">
$ opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-reposit=
ory.git
</pre>
<p>
which contains in-progress alpha releases of opam packages that are being u=
pdated for
OCaml 5.5.0 .
</p>
<p>
The final release is still planned for between May and June.
</p>
<p>
If you find any bugs, please report them on the <a href=3D"https://github.c=
om/ocaml/ocaml/issues">issue tracker</a>.
</p>
<p>
If you are interested by the full list of new features and bug fixes, the
updated <a href=3D"https://github.com/ocaml/ocaml/blob/5.5/Changes">changel=
og for OCaml 5.5.0</a> is available.
</p>
<p>
Happy hacking,
Florian Angeletti for the OCaml team
</p>
</div>
<div id=3D"outline-container-org8518588" class=3D"outline-4">
<h4 id=3D"org8518588">Changes compared to the first alpha</h4>
<div class=3D"outline-text-4" id=3D"text-org8518588">
</div>
<ul class=3D"org-ul">
<li><a id=3D"org217810c"></a>Compiler artefact fixes<br />
<div class=3D"outline-text-5" id=3D"text-org217810c">
<ul class=3D"org-ul">
<li>More bootstrap-friendly relocatable compiler</li>
<li>A bootstrap to fix compiler-libs related issues reported by js_of_ocaml=
</li>
</ul>
</div>
</li>
<li><a id=3D"org4477cc9"></a>Code generation bug fixes<br />
<div class=3D"outline-text-5" id=3D"text-org4477cc9">
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14583">#14583</a>: fix=
bug in linear scan spilling heuristic that in certain situations
could lead to miscompilations.
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Vincent Laviron)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/13693">#13693</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/14514">#14514</a>: s390x: fix=
heap corruption with libasmrun_shared.so caused
by PLT lazy binding trampoline saving FPRs into OCaml's fiber stack.
Replace PLT calls with GOT-indirect calls in the s390x code emitter.
(Zane Hambly, review by David Allsopp and Xavier Leroy)</li>
</ul>
</div>
</li>
<li><a id=3D"org3de130c"></a>Type system bug fixes<br />
<div class=3D"outline-text-5" id=3D"text-org3de130c">
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14434">#14434</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/14652">#14652</a>: Protect ch=
eck_counter_example_pat against polymorphic types,
restoring type soundness.
(Stephen Dolan and Jacques Garrigue, report and review by Alistair O'Brien)=
</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14603">#14603</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/14604">#14604</a>: avoid Ctyp=
e.apply failures when mixing
polymorphic types and unboxed constructors.
(Gabriel Scherer and Stefan Muenzel, report by Brandon Stride,
review by Florian Angeletti)</li>
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14626">#14626</a>, <a =
href=3D"https://github.com/ocaml/ocaml/issues/14675">#14675</a>: take in ac=
count module-dependent functions when
determining if an optional argument is non-erasable.
(Alistair O'Brien and Florian Angeletti, review by Gabriel Scherer)</li>
</ul>
</div>
</li>
<li><a id=3D"orgddd7d1a"></a>Standard library fix<br />
<div class=3D"outline-text-5" id=3D"text-orgddd7d1a">
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/issues/14635">#14635</a>: Fix=
a bug in <code>caml_floatarray_gather</code> that would cause
the result of <code>Float.Array.sub</code>, <code>Float.Array.append</code>=
, <code>Float.Array.concat</code>
(when empty) not to be equal to <code>[||]</code>.
(Marc Lasson, review by Gabriel Scherer)</li>
</ul>
</div>
</li>
<li><a id=3D"orgba69018"></a>Documentation update<br />
<div class=3D"outline-text-5" id=3D"text-orgba69018">
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/issues/13590">#13590</a>: Doc=
ument automatic command-line expansion of <code>*</code> and <code>?</code>=
wildcards by
the runtime under Windows.
(Benjamin Sigonneau, review by Nicol=C3=A1s Ojeda B=C3=A4r)</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-6" class=3D"outline-2">
<h2 id=3D"6">ocaml-openapi-gen 0.1.0, ocaml-forgejo</h2>
<div class=3D"outline-text-2" id=3D"text-6">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ocaml-openapi-gen-0-1-0=
-ocaml-forgejo/17929/1">https://discuss.ocaml.org/t/ann-ocaml-openapi-gen-0=
-1-0-ocaml-forgejo/17929/1</a>
</p>
</div>
<div id=3D"outline-container-orgf8aea34" class=3D"outline-3">
<h3 id=3D"orgf8aea34">Zoggy announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf8aea34">
<p>
Hello,
</p>
<p>
I just made a first release of <a href=3D"https://zoggy.frama.io/openapi/">=
ocaml-openapi-gen</a>, a tool generating code from an <a href=3D"https://ww=
w.openapis.org/">openapis</a> specification.
</p>
<p>
The <code>openapi_gen</code> package is available from my <a href=3D"https:=
//framagit.org/zoggy/opam-repository">personal opam repository</a>.
</p>
<p>
This tool is used to generate code for <a href=3D"https://zoggy.frama.io/oc=
aml-forgejo/">ocaml-forgejo</a>, a library to interact with Codeberg and ot=
her forgejo-based platforms through the <a href=3D"https://codeberg.org/api=
/swagger#/">provided REST API</a>.
</p>
<p>
The generated interfaces way evolve in the future.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-7" class=3D"outline-2">
<h2 id=3D"7">CS6868 Concurrent Programming – Course Materials</h2>
<div class=3D"outline-text-2" id=3D"text-7">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-cs6868-concurrent-progr=
amming-course-materials/17932/1">https://discuss.ocaml.org/t/ann-cs6868-con=
current-programming-course-materials/17932/1</a>
</p>
</div>
<div id=3D"outline-container-org6e81e08" class=3D"outline-3">
<h3 id=3D"org6e81e08">KC Sivaramakrishnan announced</h3>
<div class=3D"outline-text-3" id=3D"text-org6e81e08">
<p>
I=E2=80=99m currently teaching a course called =E2=80=9CCS6868: Concurrent =
Programming=E2=80=9D at IIT Madras. The goal of the course is to teach conc=
urrent and parallel programming using OCaml 5, and then introduce <a href=
=3D"https://oxcaml.org/">OxCaml</a> for safe and fast parallelism. I=E2=80=
=99ve covered the OCaml 5 parts, and will be starting OxCaml next. I though=
t it would be good to share the course materials with the community.
</p>
<p>
<a href=3D"https://github.com/kayceesrk/cs6868_s26">https://github.com/kayc=
eesrk/cs6868_s26</a>
</p>
<p>
CS6868 assumes knowledge of OCaml, which I cover in <a href=3D"https://gith=
ub.com/kayceesrk/cs3100_m20">CS3100: Paradigms of Programming</a>. This cou=
rse includes a <a href=3D"https://www.youtube.com/watch?v=3D9R8Oim7YU20&=
;list=3DPLt0HgEXFOHdkE-NTs87s7QjwYwqeihb-D">YouTube playlist</a> with all t=
he lectures, notebooks, and assignments.
</p>
<p>
CS6868 builds the foundations of parallelism, reasoning about correctness t=
hrough linearizability, parallel programming through spin locks, mutexes, c=
ondition variables, memory consistency models, and the basics of performanc=
e and non-blocking data structures (lock-free linked lists, queues, and sta=
cks). Here, the course closely follows the book <a href=3D"https://shop.els=
evier.com/books/the-art-of-multiprocessor-programming/herlihy/978-0-12-4159=
50-1">The Art of Multiprocessor Programming</a>. All the code has been redo=
ne in OCaml 5. In addition to the book content, the course also covers the =
OCaml relaxed memory model. We also cover a fair bit of OCaml-specific tool=
s here, including concurrent property-based testing using <a href=3D"https:=
//github.com/ocaml-multicore/multicoretests/">qcheck-lin and qcheck-stm</a>=
, and <a href=3D"https://ocaml.org/manual/5.3/tsan.html">data race detectio=
n using TSAN</a>.=20
</p>
<p>
Following this, the course covers the basics of effect handlers, following =
specific parts of <a href=3D"https://xavierleroy.org/control-structures/">C=
ontrol structures in programming languages: from goto to algebraic effects<=
/a>. We then build a full-fledged Go-like, multicore-capable concurrent pro=
gramming library with lightweight threads, buffered channels, selective com=
munication (in the vein of <a href=3D"https://en.wikipedia.org/wiki/Concurr=
ent_ML">Concurrent ML</a>), nested parallel programming (as in <a href=3D"h=
ttps://github.com/ocaml-multicore/domainslib">domainslib</a>), and basic as=
ynchronous IO (as in <a href=3D"https://github.com/ocaml-multicore/eio">Eio=
</a>).=20
</p>
<p>
There is a growing collection of <a href=3D"https://github.com/kayceesrk/cs=
6868_s26/blob/main/project_ideas.md">course projects</a>, which should be d=
oable if you=E2=80=99ve gone through the course materials. Let me know if y=
ou have ideas for course projects.=20
</p>
<p>
The course tries to bring together the content from <a href=3D"https://gith=
ub.com/ocaml-multicore/ocaml-effects-tutorial">many</a> <a href=3D"https://=
github.com/ocaml-multicore/ocaml5-parallelism-tutorial">tutorials</a> <a hr=
ef=3D"https://github.com/ocaml-multicore/parallel-programming-in-multicore-=
ocaml">we</a> <a href=3D"https://github.com/ocaml-multicore/effects-example=
s">have</a> done in the past. Let me know if you have feedback. I=E2=80=99m=
open to accepting PRs fixing small issues, but given that this is an ongoi=
ng course, any large PRs will likely not be accepted. I hope you will enjoy=
working through this as much as I had fun making it.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-8" class=3D"outline-2">
<h2 id=3D"8">libinput - OCaml bindings for Linux input devices</h2>
<div class=3D"outline-text-2" id=3D"text-8">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-libinput-ocaml-bindings=
-for-linux-input-devices/17933/1">https://discuss.ocaml.org/t/ann-libinput-=
ocaml-bindings-for-linux-input-devices/17933/1</a>
</p>
</div>
<div id=3D"outline-container-orgf494797" class=3D"outline-3">
<h3 id=3D"orgf494797">Thomas Leonard announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf494797">
<p>
I'm pleased to announce the first release of <a href=3D"https://github.com/=
talex5/libinput-ocaml">libinput-ocaml</a> (OCaml bindings for the libinput =
C library).
</p>
<p>
libinput is used by applications such as Wayland compositors to access mice=
, keyboards, touch pads, etc.
</p>
<p>
<a href=3D"https://roscidus.com/blog/blog/2026/03/28/input-devices/">Linux =
input devices (with libinput-ocaml)</a> explains how input devices work on =
Linux, and shows how to use the library to create a little game:
</p>
<div id=3D"orgf7f47ff" class=3D"figure">
<p><img src=3D"https://us1.discourse-cdn.com/flex020/uploads/ocaml/original=
/2X/8/87988f00d0f601de559c15f736118a8928c54664.png" alt=3D"87988f00d0f601de=
559c15f736118a8928c54664.png" width=3D"80%" />
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-9" class=3D"outline-2">
<h2 id=3D"9">OCaml compiler office hours</h2>
<div class=3D"outline-text-2" id=3D"text-9">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ocaml-compiler-office-hours=
/17230/32">https://discuss.ocaml.org/t/ocaml-compiler-office-hours/17230/32=
</a>
</p>
</div>
<div id=3D"outline-container-org8aaccff" class=3D"outline-3">
<h3 id=3D"org8aaccff">Continuing this thread, gasche announced</h3>
<div class=3D"outline-text-3" id=3D"text-org8aaccff">
<p>
I propose to hold OCaml compiler office hours on Friday April 3d, 11:00-12:=
00 UTC (in local time, [date-range from=3D2026-04-03T11:00:00 to=3D2026-04-=
03T12:00:00 timezone=3DUTC].)
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://notes.irif.fr/ncfgJV9KRRGE5HUxvaKFww#">collaborative=
pad to prepare questions/topics</a></li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-orgc48a691" class=3D"outline-2">
<h2 id=3D"orgc48a691">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-orgc48a691">
<p>
If you happen to miss a CWN, you can <a href=3D"mailto:alan.schmitt@polytec=
hnique.org">send me a message</a> and I'll mail it to you, or go take a loo=
k at <a href=3D"https://alan.petitepomme.net/cwn/">the archive</a> or the <=
a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive=
s</a>.
</p>
<p>
If you also wish to receive it every week by mail, you may subscribe to the=
<a href=3D"https://sympa.inria.fr/sympa/info/caml-list">caml-list</a>.
</p>
<div class=3D"authorname" id=3D"org381ab22">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>
</div>
</div>
</div>
</div>
</body>
</html>
--==-=-=--
--=-=-=--
--===-=-=
Content-Type: application/pgp-signature; name="signature.asc"
-----BEGIN PGP SIGNATURE-----
iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmnLZU0bFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v
cmcACgkQBA0KO07S5cehRwf/djc1IDgpVJT92d4TQ2PPeEPCEiO7JdSg4b/wXtZr
+GYqPZZM0g34ASc5EIAlFyg/V+fHmPoYItszUEpOrrUgihdWVgmljXjg5L98YJL6
Cf411NcgXElJ7m/Yw4vpjnthu6mpxO6HD0s4PG22uAsm4RX6m47i4peS8DeGXrzK
sFS0mRxHWb7bBwOaPJ8RqoGnkTpBRy8mLhg091l0AiCwUuEg8/eJmhXCMEd/5/3w
cDnfZD9Z1ko0Ub6GW9VLPLeG1EfbXQprUTg3TROBFUU7VuoV2qvTiVSiagXGU6Jk
RvmbTRxfllhyKGYsZmGwxxKKbn202nVYIn1cPYVOZt+77g==
=5mhi
-----END PGP SIGNATURE-----
--===-=-=--