From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Cm734XSm; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=nGDmRmca; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 2EAE540023 for ; Tue, 7 Oct 2025 12:22:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=6Cc2nnIGNfk4avWgrBeto1g+rm/1p7PKeR/BtL0KDJc=; b=Cm734XSmtG8VcYdvJ0G0YTARBB5i5tRi+9x/wppeZOPvPEs4+KFJmYfg 1BwYxTso7bJuHZ+uOvQGnBiTNcSkL+gZcSYn5Y/FH6zTv4KMsp8JRaskM To54kSAYr4sEAXRwJhS7j33KBc468y8PKTF6gUQ4iEqovDTVoCDhj3pHs U=; X-CSE-ConnectionGUID: y4nGpRngSaeqMtxE2unldQ== X-CSE-MsgGUID: elAcua5wSJ+SK7jPebwFcQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.18,321,1751234400"; d="scan'208,217";a="242899204" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Oct 2025 14:22:55 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id EBD44E0CDA; Tue, 7 Oct 2025 14:22:54 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 4CA9EE0171 for ; Tue, 7 Oct 2025 14:22:51 +0200 (CEST) X-CSE-ConnectionGUID: M5Ok2Q+AT7uzrnh80upqpA== X-CSE-MsgGUID: vQqbrznJRzS678wRcOi2ng== IronPort-SDR: 68e50619_OzQAS3Y123T3qV9baLGxnC2ntYJOat94gbsBe8g9SP09WVs W+S0IKuSO5QXT0CAMsf07PBloK3qpDhutgGakTQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HIBQBkBeVodyIeaIFTBxMBAQGEAFsoGQFoXjMHCEkDX?= =?us-ascii?q?oM4PINPhTWIb4EWkDeDRYc2gWmBEQMYFiMVAQMBDS4BFQoBAgQBAQMBAgGCD?= =?us-ascii?q?IIuRgKMRwIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEB?= =?us-ascii?q?gECEAFDSYZPDYJFLSRxYQQDBgYBAQEBAQEBAQEnAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIEBAMBAQIFIg4LAT8ODgECB?= =?us-ascii?q?gQGEwEBJgUNGBQPAwkBAQkBBgMCEQE1AxQBEhQFAQGCD1mCIAICTwMFDAaRH?= =?us-ascii?q?JtMen8zgQGCDAEBBoEIPgIBAgkCBQEOCSbaDIFkCYFKhW2CShoBKklrAoRHh?= =?us-ascii?q?DwnD4FVRIEVNYFzSgdvgVBvIgEBAQEYQgI7CQQFARECAQgDDw8REwkJCQKDE?= =?us-ascii?q?YJpghEVgQIUHVg/ITRfcDaBOQJtgSJAghcsGnWER4IrAwYEQns6AgMBi3SBR?= =?us-ascii?q?EszLAFVExcLBwVbgQgDKjQxbjIdgSeFC4QeK0+FAoEYg1MPE2sPBoEVg1qJb?= =?us-ascii?q?A+CdQMLbT03FBuZVRcrGWIGAhaBQwQRAQEEIA44BgIgCQMEDBoBEgoHBQkFA?= =?us-ascii?q?QIFDAgOAQEEHAIuAwUFBBAKCgwHBRYPAQILAQkFBgMVAwMCDh8LCy8DghKQO?= =?us-ascii?q?QoCJQMqAgF0nH2TWR1tNAeEH4FeBgyIHmqBJo4ADIQjg1eEBIFXhUCFfIcCk?= =?us-ascii?q?lIimGQigjaGGoENgSYJgW8fTJU0AioXCYU5gX8jbD8BHQwHMxowQw0QAgIBg?= =?us-ascii?q?hEBATIJCjwcD1eHSoVeKwMWgRIBAoJJM4ELInkGBYE7OTt9QIEprDIDQTUBA?= =?us-ascii?q?QEBDCwCBwEKAQEDCYViAQGMBgImAwlrA10BAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 tVgD7XSyqhIxIC9FYB6ETk0xq8= IronPort-HdrOrdr: A9a23:KWX18qrHr+DYEwj6G29Iz1saV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: 9a23:sLuE6WOQmwww1u5DfXRA9xQtWekZLWDP1nHQcxelEX9xYejA X-Talos-MUID: 9a23:x2DxgwunvnCdRftJY82nmgh7Pt165YaUGntTzsUZgcKjNHZ2NGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.18,321,1751234400"; d="scan'208,217";a="242899164" X-MGA-submission: =?us-ascii?q?MDF2TBUANIefsWUN07fIgJrQ+rjeq2yANjdl2k?= =?us-ascii?q?tetPNbIly43azK5HOtxazODIXJQQnC/KrpmMZB3FJvYNgrX1yHqyfupu?= =?us-ascii?q?eUSzfWbx5tLZ9YOJVazJTdLH7Pn/rzCRSe1dt12TxiPrqNY/H3VFDEm3?= =?us-ascii?q?1PqwcmXevrqshKG1XuIG7lkg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Oct 2025 14:22:49 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F33321A2E9; Tue, 7 Oct 2025 14:22:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1759839769; bh=iS+J1XhiOef5BusoYOdEYsMO7vwv4aIoqrTYymsrk6I=; h=From:To:Subject:Date:Message-ID; b=nGDmRmcavbUfJiz3TKuJRC0SlfOEFxJo8eYT3QRITtd3aGv2hC8tCQ4idMmyAPdUU aeIHofwYEGuZXwDw1h4igy9tyqXJHxidA0LRjpiol0i2m6K3Qm6hhY2HZkEWUyBOjl QkaecKM657ZKRBWQbvNSM7bBu5Q5AGjBVfir8feM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 07 Oct 2025 14:22:48 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 7 14:22:49 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.468686, queueID=2559A1A2F8 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19383 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 30 to October 07, 2025. 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 moonpool 0.9, moonpool-lwt 0.9 First release candidate for OCaml 5.4.0 Announcing the OCaml Zulip at ocaml.zulipchat.com An impressive macrobenchmark for eio nim-ocaml Call for Contributions: BOB 2026 (Berlin, March 13 - Deadline Nov 17) ocp-indent 1.9.0 Sketch.sh now supports OCaml 5.3.0 OUPS meetup october 2025 New releases of Merlin (5.6) and OCaml-LSP (1.24.0) Other OCaml News Old CWN moonpool 0.9, moonpool-lwt 0.9 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Simon Cruanes 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 Hello camels, I=E2=80=99m happy to announce the release of [moonpool 0.9] and moonpool-= lwt 0.9. Moonpool is a concurrency and parallelism library that provides lightweight fibers and a concept of `Runner.t' that they can be dispatched on. Multiple runners can co-exist inside a program. This release is a fairly large one. First, Moonpool now requires OCaml >=3D 5.0 (no more 4.xx compat), which removes the need for a preprocessor and makes `await' generally available on every `Runner.t'. Some sub-libraries are now deprecated (`moonpool-io', `moonpool.sync' in favor of picos, etc.). The biggest improvement is `moonpool-lwt'. It now wraps `Lwt_main.run' and turns it into a `Moonpool.Runner.t', meaning that `Lwt', `Lwt_io', `Lwt_unix', and all the libraries built on top can now directly be used from Moonpool. `Lwt' promises can be turned into moonpool futures and conversely; fibers can be spawned in the `Lwt_engine' loop from any thread (to perform IO and call lwt libraries) and be awaited from other threads, too. Documentation: , [moonpool 0.9] Example echo server =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=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module M_lwt =3D Moonpool_lwt =E2=94=82=20 =E2=94=82 let ( let@ ) =3D ( @@ ) =E2=94=82 let str_of_sockaddr =3D function =E2=94=82 | Unix.ADDR_UNIX s -> s =E2=94=82 | Unix.ADDR_INET (addr, port) -> =E2=94=82 Printf.sprintf "%s:%d" (Unix.string_of_inet_addr addr) port =E2=94=82=20 =E2=94=82=20 =E2=94=82 let main ~port () : unit =3D =E2=94=82 (* never resolved *) =E2=94=82 let lwt_fut, _lwt_prom =3D Lwt.wait () in =E2=94=82=20 =E2=94=82 let handle_client client_addr (ic, oc) : _ Lwt.t =3D =E2=94=82 (* spawn a new fiber in the lwt thread *) =E2=94=82 let@ () =3D M_lwt.spawn_lwt in =E2=94=82 Printf.printf "got new client on %s\n%!" (str_of_sockaddr c= lient_addr); =E2=94=82=20 =E2=94=82 let buf =3D Bytes.create 1024 in =E2=94=82 let continue =3D ref true in =E2=94=82 while !continue do =E2=94=82 let n =3D Lwt_io.read_into ic buf 0 (Bytes.length buf) |>= M_lwt.await_lwt in =E2=94=82 if n =3D 0 then =E2=94=82 continue :=3D false =E2=94=82 else ( =E2=94=82 Lwt_io.write_from_exactly oc buf 0 n |> M_lwt.await_lwt; =E2=94=82 Lwt_io.flush oc |> M_lwt.await_lwt; =E2=94=82 ) =E2=94=82 done; =E2=94=82 Printf.printf "done with client on %s\n%!" (str_of_sockaddr= client_addr); =E2=94=82 in =E2=94=82=20 =E2=94=82 Printf.printf "listening on port=3D%d\n%!" port; =E2=94=82 let addr =3D Unix.ADDR_INET (Unix.inet_addr_any, port) in =E2=94=82 let _server =3D =E2=94=82 Lwt_io.establish_server_with_client_address addr handle_cli= ent =E2=94=82 |> M_lwt.await_lwt =E2=94=82 in =E2=94=82=20 =E2=94=82 M_lwt.await_lwt lwt_fut (* never returns *) =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 let port =3D ref 1234 in =E2=94=82 let opts =3D =E2=94=82 [ =E2=94=82 "-p", Arg.Set_int port, " port"; =E2=94=82 ] =E2=94=82 |> Arg.align =E2=94=82 in =E2=94=82 Arg.parse opts ignore "echo server"; =E2=94=82=20 =E2=94=82 M_lwt.lwt_main @@ fun _ -> main ~port:!port () =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Run it as `echo_server -p 1234' and use `nc localhost 1234' to connect. It will echo lines sent to it. We can reuse `Lwt_io.establish_server_with_client_address' just fine, and use direct style to implement the client handler inside a single `Moonpool' fiber (via `Moonpool_lwt.spawn_lwt' that runs its argument in the lwt event loop). Small server with a thread pool for compute =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 a variation on the previous one, with a thread pool on which CPU bound tasks can be run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module M_lwt =3D Moonpool_lwt =E2=94=82=20 =E2=94=82 let ( let@ ) =3D ( @@ ) =E2=94=82 let str_of_sockaddr =3D function =E2=94=82 | Unix.ADDR_UNIX s -> s =E2=94=82 | Unix.ADDR_INET (addr, port) -> =E2=94=82 Printf.sprintf "%s:%d" (Unix.string_of_inet_addr addr) port =E2=94=82=20 =E2=94=82 (* don't do this at home *) =E2=94=82 let rec fib n =3D =E2=94=82 if n <=3D 2 then 1 else fib (n-1) + fib (n-2) =E2=94=82=20 =E2=94=82 let main ~port ~tpool () : unit =3D =E2=94=82 (* never resolved *) =E2=94=82 let lwt_fut, _lwt_prom =3D Lwt.wait () in =E2=94=82=20 =E2=94=82 let handle_client client_addr (ic, oc) : _ Lwt.t =3D =E2=94=82 (* spawn a new fiber in the lwt thread *) =E2=94=82 let@ () =3D M_lwt.spawn_lwt in =E2=94=82 Printf.printf "got new client on %s\n%!" (str_of_sockaddr c= lient_addr); =E2=94=82=20 =E2=94=82 let continue =3D ref true in =E2=94=82 while !continue do =E2=94=82 match Lwt_io.read_line ic |> M_lwt.await_lwt with =E2=94=82 | exception End_of_file -> continue :=3D false =E2=94=82 | line -> =E2=94=82 let input =3D int_of_string @@ String.trim line in =E2=94=82 (* run fib(input) in the thread pool and suspend until =E2=94=82 it's done *) =E2=94=82 let fib_input =3D =E2=94=82 Moonpool.Fut.spawn ~on:tpool (fun () -> fib input) =E2=94=82 |> Moonpool.Fut.await =E2=94=82 in =E2=94=82=20 =E2=94=82 Lwt_io.write oc (Printf.sprintf "%d\n" fib_input) =E2=94=82 |> M_lwt.await_lwt; =E2=94=82 Lwt_io.flush oc |> M_lwt.await_lwt; =E2=94=82 done; =E2=94=82=20 =E2=94=82 Printf.printf "done with client on %s\n%!" (str_of_sockaddr= client_addr); =E2=94=82 in =E2=94=82=20 =E2=94=82 Printf.printf "listening on port=3D%d\n%!" port; =E2=94=82 let addr =3D Unix.ADDR_INET (Unix.inet_addr_any, port) in =E2=94=82 let _server =3D =E2=94=82 Lwt_io.establish_server_with_client_address addr handle_cli= ent =E2=94=82 |> M_lwt.await_lwt =E2=94=82 in =E2=94=82=20 =E2=94=82 M_lwt.await_lwt lwt_fut (* never returns *) =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 let port =3D ref 1234 in =E2=94=82 let j =3D ref 8 in =E2=94=82 let opts =3D =E2=94=82 [ =E2=94=82 "-j", Arg.Set_int j, " thread pool size"; =E2=94=82 "-p", Arg.Set_int port, " port"; =E2=94=82 ] =E2=94=82 |> Arg.align =E2=94=82 in =E2=94=82 Arg.parse opts ignore "echo server"; =E2=94=82=20 =E2=94=82 let@ tpool =3D Moonpool.Ws_pool.with_ ~num_threads:!j () in =E2=94=82 M_lwt.lwt_main @@ fun _ -> main ~port:!port ~tpool () =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Note how the computation is done by starting a task in the `tpool' argument (a moonpool `Runner.t' provided to the main, by default a work stealing pool of 8 threads that can be set via `-j ') and then `await'-ed from the lwt handler. While the computation is running, the lwt client handler is suspended and doesn=E2=80=99t prevent other clients from making progress. To test this one, use `nc localhost 1234' and write (small) integers to get `fib(n)' computed. To see it work in parallel, open `top' or `htop' and run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 for i in `seq 1 200`; do nc localhost 1234 <<< '35' & done =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 First release candidate for OCaml 5.4.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=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: 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 The release of OCaml 5.4.0 is imminent. As a final step, we are publishing a release candidate to check that everything is in order before the release in the upcoming week. If you find any bugs, please report them on the [OCaml's issue tracker]. Compared to the second beta, this release candidate only contains a fix in the TSAN mode, and one metadata fix in the changelog itself. The full change log for OCaml 5.4.0 is available on [GitHub]. Happy hacking, Florian Angeletti for the OCaml team. [OCaml's issue tracker] [GitHub] Installation instructions =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 The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: opam update opam switch create 5.4.0~rc1 The source code for the release candidate is also directly available on: =E2=80=A2 GitHub: =E2=80=A2 OCaml archives at Inria: Fine-tuned compiler configuration =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 If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.4.0~rc1+optio= ns =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `' is a space-separated list of `ocaml-option-*' packages. For instance, for a `flambda' and `no-flat-float-array' switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.4.0~rc1+flambda+nffa ocaml-variants.5.4.0~= rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Announcing the OCaml Zulip at ocaml.zulipchat.com =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: ancolie 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 Dear OCaml community, There has been a recent renewed interest in maintaining an open, organized and synchronous communication channel, and the OCaml Zulip has been revived. It is freely readable without an account at [ocaml.zulipchat.org], and can be accessed through various means of authentication, including Github accounts. On Zulip, we have full access to our data at all time, and should the company change its policy, the data can be retrieved and the current version of Zulip server is self-hostable. In the meantime, we have been graciously offered sponsorship as an open community and can enjoy all features of the platform for free, and we thank Zulip for that. The platform can be accessed either on the web (one tab per server), or on the desktop and mobile client, which allow for managing multiple organizations. Talking about multiple organizations, there are already many OCaml, programming languages and verification related Zulip servers, such as [Rocq], [Types], [Why3], [Catala], [Bytecode alliance], [Owi] or [Aeneas]. Check-out the full list of [open to the public communities] for more. Finally, we would like to emphasize that any governance team or project is welcome to host their discussions on the Zulip, where a channel can be created and admin rights granted. Cheers! PS: For anyone already on the Zulip, as part of this effort, the URL was migrated from `caml.zulipchat.org' to `ocaml.zulipchat.org' and you may have to remove the server and login again. [ocaml.zulipchat.org] [Rocq] [Types] [Why3] [Catala] [Bytecode alliance] [Owi] [Aeneas] [open to the public communities] An impressive macrobenchmark for eio =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=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: conroj said =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 While wandering around the web I came across a link to a [slide deck] by our own @kayceesrk. On slide #35 is a macrobenchmark showing an EIO-based network server, and its throughput is pretty favorable compared to the Rust implementation=E2=80=99s. Taking this at face value, it seems like quite an achievement - not only because GC is (supposedly) a handicap for OCaml, but also because this seems like a major improvement over a [similar benchmark] from 2022. I couldn=E2=80=99t find links to deeper discussion of these results= , so I thought I would ask some of the obvious follow-up questions: =E2=80=A2 Is OCaml=E2=80=99s tail latency on par with Rust=E2=80=99s in t= hese scenarios? =E2=80=A2 Are both the =E2=80=9COCaml eio=E2=80=9D and =E2=80=9CRust Hype= r=E2=80=9D results using similar kernel capabilities, e.g. `io_uring'? (The slide seems to suggest so, but just confirming.) =E2=80=A2 Do these results generalize to different levels of concurrency, request/response sizes, etc? Either way, kudos for raising OCaml=E2=80=99s profile as a platform for scalable computing! [slide deck] [similar benchmark] Anil Madhavapeddy replied =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 They both used io_uring, yes. The OCaml bindings are at ; but note that there are several levels of io_uring usage possible depending on your tolerance for ranges of Linux kernel support (I=E2=80=99m just adding zero-copy transmit support at the moment for a project involving a petabyte of data). OCaml=E2=80=99s tail latency will be worse than Rust=E2=80=99s due to hav= ing a GC, but not terribly so. As for generalization, those tests were run on a pre-5.0 version of OCaml, so the whole test suite would have to be rebased against the released versions. A good and useful exercise if someone would like to have a go at it! Thomas Leonard also replied =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 think the benchmarks are from I don=E2=80=99t think the Rust ones are using uring, but I=E2=80=99m not = sure. I suspect that all the non-OCaml ones could do with a fan of that language optimising them a bit. In my experience, whether the Rust or Eio version gets better throughput depends on e.g. the number of connections, and tail latency was always better with Rust. But the basic result is that OCaml is competitive with Rust here. nim-ocaml =E2=95=90=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: Florent Monnier 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 I read a paper maybe not this one, but it seems it talks about the same thing [https://arxiv.org/html/2506.04657v1]. At the beginning I thought it's about the new programming language, but then chatgpt explained me that in fact it's a small game with stones. We put a given number of stones in the middle, and each player can take 1, 2 or 3 stones from the stack. There are two variants of the game, the one that only has one stone in front of him at the end wins or not. So I tryed to make a `nim-ocaml' to play against its `Random.state', here below: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let () =3D =E2=94=82 Random.self_init () ; =E2=94=82 let n =3D 13 + (Random.int 23) in =E2=94=82 let _n =3D ref n in =E2=94=82 let run =3D ref true in =E2=94=82 while !run do =E2=94=82 Printf.printf "%d\n" !_n; =E2=94=82 if !_n <=3D 1 then run :=3D false ; =E2=94=82 let line =3D read_line () in =E2=94=82 begin =E2=94=82 try =E2=94=82 let d =3D int_of_string line in =E2=94=82 _n :=3D !_n - d ; =E2=94=82 with _ -> =E2=94=82 Printf.printf "please input an integer number\n%!"; =E2=94=82 end; =E2=94=82 let b =3D Random.int 2 + Random.int 3 in =E2=94=82 Printf.printf "b played: %d\n" b; =E2=94=82 _n :=3D !_n - b ; =E2=94=82 done; =E2=94=82 Printf.printf "done!\n" ; =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml nim.ml=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Or later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ wget http://decapode314.free.fr/ocaml2/nim/nim.ml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml nim.ml =E2=94=82 23 =E2=94=82 3 =E2=94=82 b played: 3 =E2=94=82 17 =E2=94=82 7 =E2=94=82 b played: 0 =E2=94=82 10 =E2=94=82 3 =E2=94=82 b played: 2 =E2=94=82 5 =E2=94=82 2 =E2=94=82 b played: 2 =E2=94=82 1 =E2=94=82 0 =E2=94=82 b played: 0 =E2=94=82 done! =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Another version to play against your collegue at the pause: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ wget http://decapode314.free.fr/ocaml2/nim/.gil/nim.ml.0 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [https://arxiv.org/html/2506.04657v1] Call for Contributions: BOB 2026 (Berlin, March 13 - Deadline Nov 17) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=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: Michael Sperber 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 OCaml contributions are spot-on for BOB - send us some! *BOB Conference 2026 - Call for Contributions* =E2=80=9CWhat happens when we use what=E2=80=99s best for a change?=E2=80=9D =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=E2=95=8C= =E2=95=8C=E2=95=8C =E2=80=A2 =E2=80=A2 Berlin, Mar 13 =E2=80=A2 Deadline: November 17, 2025 Looking for Speakers =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 You are actively engaged in advanced software engineering methods, solve ambitious problem with software and are open to cutting-edge innovation? Attend this conference, meet people that share your goals, and get to know the best software tools and technologies available today. We strive to offer a day full of new experiences and impressions that you can use to immediately improve your daily life as a software developer. If you share our vision and want to contribute, submit a proposal for a talk or tutorial! *NOTE*: The conference fee will be waived for presenters. Travel expenses will not be covered (for exceptions see =E2=80=9CSpeaker Grants= =E2=80=9D). Topics =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We are looking for talks about best-of-breed software technology, e.g.: =E2=80=A2 functional programming =E2=80=A2 persistent data structures and databases =E2=80=A2 event-based modelling and architecture =E2=80=A2 =E2=80=9Cfancy types=E2=80=9D (dependent types, gradual typing,= linear types, =E2=80=A6) =E2=80=A2 formal methods for correctness and robustness =E2=80=A2 abstractions for concurrency and parallelism =E2=80=A2 metaprogramming =E2=80=A2 probabilistic programming =E2=80=A2 math and programming =E2=80=A2 controlled side effects =E2=80=A2 program synthesis =E2=80=A2 AI beyond vibecoding and chatbots =E2=80=A2 linked data =E2=80=A2 symbolic AI =E2=80=A2 next-generation IDEs =E2=80=A2 effective abstractions for data analytics =E2=80=A2 =E2=80=A6 everything really that isn=E2=80=99t mainstream, but = you think should be =E2=80=A2 =E2=80=A6 including rough ideas that are worth discussing. Presenters should provide the audience with information that is practically useful for software developers. Challenges =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 Furthermore, we seek contributions on successful approaches for solving hard problems, for example: =E2=80=A2 bias in machine-learning systems =E2=80=A2 digital transformation in difficult settings =E2=80=A2 accessibility =E2=80=A2 systems with critical reliability requirements =E2=80=A2 ecologically sustainable software development *We=E2=80=99re especially interested in experience reports.* Other topics are also relevant, e.g.: =E2=80=A2 introductory talks on technical background =E2=80=A2 overviews of a given field =E2=80=A2 demos and how-tos Requirements =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 We accept proposals for presentations of 45 minutes (40 minutes talk + 5 minutes questions), as well as 90 minute tutorials for beginners. The language of presentation should be either English or German. Your proposal should include (in your presentation language of choice): =E2=80=A2 An abstract of max. 1500 characters. =E2=80=A2 A short bio/cv =E2=80=A2 Contact information (including at least email address) =E2=80=A2 A list of 3-5 concrete ideas of how your work can be applied in= a developer=E2=80=99s daily life =E2=80=A2 additional material (websites, blogs, slides, videos of past presentations, =E2=80=A6) [Submit here] [Submit here] Organisation =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=80=A2 Direct questions to `konferenz at bobkonf dot de' =E2=80=A2 Proposal deadline: *November 17, 2025* =E2=80=A2 Notification: December 5, 2025 =E2=80=A2 Program: December 12, 2025 Shepherding =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 The program committee offers shepherding to all speakers. Shepherding provides speakers assistance with preparing their sessions. Specifically: =E2=80=A2 advice on structure and presentation =E2=80=A2 review of talk slides Speaker Grants =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 BOB has Speaker Grants available to support speakers from groups under-represented in technology. We specifically seek women speakers, speakers of color, and speakers who are not able to attend the conference for financial reasons. ocp-indent 1.9.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 Archive: Nathan Rebours 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 Here at OCamlPro we=E2=80=99re happy to announce the (long awaited) relea= se of ocp-indent.1.9.0. The full release notes are available [here] if you want the detailed version. 1.9.0 contains mostly bug fixes, better and more consistent indentation of `fun _ ->' and `|>', compatibility with cmdliner.1.3.0 and above (it works with 2.0.0) and a new utility tool: `ocp-indent-gen-rules' for those of you who would like to try `ocp-indent' in a `dune fmt' like workflow. This last bit is documented [here]. This is a feature that some of us wanted internally at OCamlPro so we decided to ship it with the tool as an experiment. We=E2=80=99d really like to hear if this fits your ocp-indent usage so please don=E2=80=99t hesitate to try it out and give = us some feedback. We=E2=80=99re also interested in hearing how you use ocp-indent in genera= l and what you expect from it. Reach out if you have any request! We=E2=80=99ve also updated the repo to fit the more recent development standards. We migrated the test suite to dune cram tests and re-enabled them in opam. Hopefully this should make contributing to ocp-indent a smoother experience! Also be aware that we=E2=80=99ll do our best to maintain ocp-indent more actively from now on. We=E2=80=99d like to thank our external contributors for this release: @dbuenzli, @nojb, @bcc32 and @Julow. Happy indenting! [here] [here] Sketch.sh now supports OCaml 5.3.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 Archive: Javier Ch=C3=A1varri 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 The interactive OCaml sketchbook [sketch.sh] has added support for OCaml 5.3.0. [sketch.sh] *Support for 5.3.0* =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 Storing and running sketches using the compiler version 5.3.0 is now possible, this functionality has been added to the already existing support for versions 4.06.1 and 4.13.1. This new version brings support for OCaml 5=E2=80=99s effect handlers and multicore capabilities. Since sketch.sh runs in the browser using JavaScript via js_of_ocaml, the multicore capabilities are simulated using [continuation-passing style]. Here you can see a sketch showcasing effects: [Effects Example - Sketch.sh]. While support for intermediate versions is technically possible, it will require adding a mechanism to support choosing the version of the compiler for the current sketch (see [issue #375]). [continuation-passing style] [Effects Example - Sketch.sh] [issue #375] *Existing sketches and forks* =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 Previously existing sketches remain in their original compiler version, while newly created sketches will be on 5.3.0 by default. For now, the only way to "migrate" a sketch to a newer version of the compiler is by copying its content and pasting it in a new sketch. Forked sketches inherit the compiler version of the upstream sketch. *Reporting features and issues* =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 Please [let us know] in case you have a feature request, or if you encounter any issues or bugs. Also, don't hesitate to reach out via [Reason Discord] or Discuss DMs if you would like to contribute or participate in the project in some way. There are a lot of opportunities to do so, both on the frontend and backend sides. [let us know] [Reason Discord] OUPS meetup october 2025 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: ancolie 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 The next OUPS meetup will take place on *Monday, 13th of October* 2025. It will start at *6:30pm* at the *4 place Jussieu* in Paris. It will be in the in the *Esclangon building* (amphi Astier). Please, *[register on meetup ]* as soon as possible to let us know how many pizza we should order. For more details, you may check the [OUPS=E2=80=99 website ]. Moreover, we'd like to announce that the organizing team moved to the [OCaml Zulip]. Feel free to contact us there if you'd like to suggest talks. This time we=E2=80=99ll have the following talks: *What's the deal with modular implicits ? =E2=80=93 Samuel Vivien* Modular implicits est une extension d'OCaml pr=C3=A9sent=C3=A9e en 2014 comme une solution =C3=A0 l'absence de type classe en OCaml. Cependant malgr=C3=A9 l'anciennet=C3=A9 de cette proposition cette fonctionnalit=C3=A9 n'est toujours pas disponible dans OCaml. Nous ferons un tour d'horizon de modular implicits pour rappeler comment cette fonctionnalit=C3=A9 marche, ce qui as d=C3=A9j=C3=A0 =C3=A9t=C3=A9 impl=C3=A9ment=C3=A9 dans le compil= ateur mais aussi ce qu'il reste =C3=A0 faire ainsi que les probl=C3=A9matiques li=C3=A9= s au typage des implicites. *Flambda2: Abstractions without Cost =E2=80=93 Guillaume Bury* Surprise. After the talks there will be some pizzas offered by the [OCaml Software Foundation] and later on we=E2=80=99ll move to a pub nearby as u= sual. [register on meetup ] [OUPS=E2=80=99 website ] [OCaml Zulip] [OCaml Software Foundation] New releases of Merlin (5.6) and OCaml-LSP (1.24.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=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=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: Xavier Van de Woestyne 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 We are pleased to announce new releases of *Merlin* (`5.6-504' and `5.6-503') and *OCaml-LSP* (`1.24.0', for `5.4', and `1.23.1')! This release of *Merlin* offers, firstly, support for OCaml `5.4'. It improves support for OpenBSD (for `merlin-reader'), improves typing recovery in the handling of mutual recursion, and adds a new feature to the protocol: `locate-types'. It works similarly to `locate-type', except that it allows you to distinguish between several _locatable_ types in an expression like this: `(int, Foo.t) result' enabling the location of: `int', `Foo.t' and `('a, 'b) result'. In addition, the Vim client has been fixed for the use of `project-wide-occurrences'. The release of *OCaml LSP* also mainly concerns support for `5.4' and several bug fixes. As with every version upgrade, *we are eager to hear user feedback*. Try out these new releases on your `5.4' switches and don't hesitate to report any issues you encounter ([Merlin], [OCaml LSP])! [Merlin] [OCaml LSP] Merlin Changelog =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 Merlin `5.6-504' (& `5.6-503') =E2=81=83 merlin binary =E2=80=A2 Add `locate-types' command (#1951) =E2=81=83 merlin library =E2=80=A2 Fix `merlin_reader' for OpenBSD (#1956) =E2=80=A2 Improve recovery of mutually recursive definitions (#1962, #1= 963, fixes #1953) =E2=80=A2 Support for OCaml `5.4' (#1974) (*only for `5.6-504'*) =E2=81=83 vim plugin =E2=80=A2 Fix error when `:MerlinOccurrencesProjectWide' fails to gather code previews (#1970) =E2=81=83 test suite =E2=80=A2 Add more short-paths tests cases (#1904) OCaml LSP Changelog =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 `1.24.0' & `1.23.1' =E2=81=83 features =E2=80=A2 Support for OCaml `5.4' (#1559) =E2=81=83 fixes =E2=80=A2 Fix hover on method calls not showing the type. (#1553, fixes #1552) =E2=80=A2 Fix error on opening `.mll' files (#1557) =E2=80=A2 Ensure compatibility with both yojson 2.0 and 3.0. (#1534) *Happy Hacking*! The Merlin Team :man_mage: :two_hump_camel: Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =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 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [One year at Ahrefs] =E2=80=A2 [Attempting overlayfs with macFuse] =E2=80=A2 [Mental Check: Reflecting on the OCaml Journey So Far] =E2=80=A2 [Ocsigen: A Full OCaml Framework for Websites and Apps] =E2=80=A2 [File descriptors as integers considered harmful] =E2=80=A2 [Hacking OCaml] =E2=80=A2 [File descriptors are not integers] [the ocaml.org blog] [Upcoming OCaml Events] [One year at Ahrefs] [Attempting overlayfs with macFuse] [Mental Check: Reflecting on the OCaml Journey So Far] [Ocsigen: A Full OCaml Framework for Websites and Apps] [File descriptors as integers considered harmful] [Hacking OCaml] [File descriptors are not integers] 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] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of September 30 to Octob= er 07, 2025.

moonpool 0.9, moonpool-lwt 0.9

Simon Cruanes announced

Hello camels,

I=E2=80=99m happy to announce the release of moonpool 0.9 and moonpool-lwt 0.9. M= oonpool is a concurrency and parallelism library that provides lightweight = fibers and a concept of Runner.t that they can be dispatched o= n. Multiple runners can co-exist inside a program.

This release is a fairly large one. First, Moonpool now requires OCaml >= =3D 5.0 (no more 4.xx compat), which removes the need for a preprocessor an= d makes await generally available on every Runner.t. Some sub-libraries are now deprecated (moonpool-io, = moonpool.sync in favor of picos, etc.).

The biggest improvement is moonpool-lwt. It now wraps Lw= t_main.run and turns it into a Moonpool.Runner.t, meani= ng that Lwt, Lwt_io, Lwt_unix, and a= ll the libraries built on top can now directly be used from Moonpool. Lwt promises can be turned into moonpool futures and conversely; fi= bers can be spawned in the Lwt_engine loop from any thread (to= perform IO and call lwt libraries) and be awaited from other threads, too.

Documentation: https://c-cube.github.io/moonpool/moonpool/index.html , https://c-cube.github.io/moonpool/moonpool-lwt/Moonpool_lwt/index.html

Example echo server

module M_lwt =3D <=
span style=3D"color: #444fcf;">Moonpool_lwt

let ( let@ ) =3D ( @@=
 )
let str_of_sockaddr =3D function
  | Unix.ADDR_UNIX s -> s
  | Unix.ADDR_INET (addr, port) ->
    Printf.sprintf "%s:%d" (Unix.=
string_of_inet_addr addr) port


let main ~port () : unit =3D
  (* never resolved *)
  let lwt_fut, _lwt_p=
rom =3D Lwt.wait () in

  let handle_client c=
lient_addr (ic, oc) : _ =
Lwt.=
t =3D
    (* spawn a new fiber in the lwt thr=
ead *)
    let@ () =3D <=
span style=3D"color: #444fcf;">M_lwt.spawn_lwt in
    Printf.printf "got new client on %s\n%!" (str_of_sockaddr client_add=
r);

    let buf =3D Bytes=
.create 1024 in
    let continue =3D ref true <=
span style=3D"color: #000000; font-weight: bold;">in
    while !continue do
      let n =3D Lwt_i=
o.read_into ic buf 0 (Bytes.l=
ength buf) |> M_lwt.await_lwt in
      if n =3D 0 =
then
        continue :=3D false
      else (
        Lwt_io.write_from_exactly oc=
 buf 0 n |> M_lwt.await_lwt;
        Lwt_io.flush oc |> M_lwt.await_lwt;
      )
    done;
    Printf.printf "done with client on %s\n%!" (str_of_sockaddr client_a=
ddr);
  in

  Printf.printf "listening on port=3D%d\n%!" port;
  let addr =3D Unix.<=
/span>ADDR_INET<=
/span> (Unix.inet_addr_any, port) in
  let _server =3D
    Lwt_io.establish_server_with_cli=
ent_address addr handle_client
    |> M_lwt.await_lwt
  in

  M_lwt.await_lwt lwt_fut (* never returns *)

let () =3D
  let port =3D ref 1234 in
  let opts =3D
    [
      "-p", Arg.Set_int port, " port";
    ]
    |> Arg.align
  in
  Arg.parse opts ignore "echo server";

  M_lwt.lwt_main @@ f=
un _ -> main ~port:!p=
ort ()

Run it as echo_server -p 1234 and use nc localhost 1234<= /code> to connect. It will echo lines sent to it.

We can reuse Lwt_io.establish_server_with_client_address just = fine, and use direct style to implement the client handler inside a single = Moonpool fiber (via Moonpool_lwt.spawn_lwt that r= uns its argument in the lwt event loop).=20

Small server with a thread pool for compute

a variation on the previous one, with a thread pool on which CPU bound task= s can be run:

module M_lwt =3D <=
span style=3D"color: #444fcf;">Moonpool_lwt

let ( let@ ) =3D ( @@=
 )
let str_of_sockaddr =3D function
  | Unix.ADDR_UNIX s -> s
  | Unix.ADDR_INET (addr, port) ->
    Printf.sprintf "%s:%d" (Unix.=
string_of_inet_addr addr) port

(* don't do this at home *)
let rec fib n =3D
  if n <=3D 2 =
then 1 else fib (n-1) + fib (n-2)

let main ~port ~tpool () : unit =3D
  (* never resolved *)
  let lwt_fut, _lwt_p=
rom =3D Lwt.wait () in

  let handle_client c=
lient_addr (ic, oc) : _ =
Lwt.=
t =3D
    (* spawn a new fiber in the lwt thr=
ead *)
    let@ () =3D <=
span style=3D"color: #444fcf;">M_lwt.spawn_lwt in
    Printf.printf "got new client on %s\n%!" (str_of_sockaddr client_add=
r);

    let continue =3D ref true <=
span style=3D"color: #000000; font-weight: bold;">in
    while !continue do
      match Lwt_io.read_line ic |> M_lwt.await_=
lwt with
      | exception=
 End_of_file -> continue :=3D false
      | line ->
        let input =3D int_of_string @@ String.trim=
 line in
        (* run fib(input) in the thread=
 pool and suspend until
           it's done *)
        let fib_input =3D
          Moonpool.Fut.spawn ~on:tpool (fun () -> fib input)
          |> Moonpool.Fut.await
        in

        Lwt_io.write oc (Printf.sprintf =
"%d\n" fib_input)
          |> M_lwt.await_lwt;
        Lwt_io.flush oc |> M_lwt.await_lwt;
    done;

    Printf.printf "done with client on %s\n%!" (str_of_sockaddr client_a=
ddr);
  in

  Printf.printf "listening on port=3D%d\n%!" port;
  let addr =3D Unix.<=
/span>ADDR_INET<=
/span> (Unix.inet_addr_any, port) in
  let _server =3D
    Lwt_io.establish_server_with_cli=
ent_address addr handle_client
    |> M_lwt.await_lwt
  in

  M_lwt.await_lwt lwt_fut (* never returns *)

let () =3D
  let port =3D ref 1234 in
  let j =3D ref 8 i=
n
  let opts =3D
    [
      "-j", Arg.Set_int j, " thread pool size";
      "-p", Arg.Set_int port, " port";
    ]
    |> Arg.align
  in
  Arg.parse opts ignore "echo server";

  let@ tpool =3D Moon=
pool.Ws_pool.with_ ~num_threads:!j () in
  M_lwt.lwt_main @@ f=
un _ -> main ~port:!p=
ort ~tpool ()

Note how the computation is done by starting a task in the tpool argument (a moonpool Runner.t provided to the main, by defa= ult a work stealing pool of 8 threads that can be set via -j <numb= er of threads>) and then await-ed from the lwt handl= er. While the computation is running, the lwt client handler is suspended a= nd doesn=E2=80=99t prevent other clients from making progress.

To test this one, use nc localhost 1234 and write (small) inte= gers to get fib(n) computed. To see it work in parallel, open = top or htop and run:

for i in `seq 1 200`; do nc localhost 1234 <<< '35' &  done

First release candidate for OCaml 5.4.0

octachron announced

The release of OCaml 5.4.0 is imminent.

As a final step, we are publishing a release candidate to check that everyt= hing is in order before the release in the upcoming week.

If you find any bugs, please report them on the OCaml's issue tracker.

Compared to the second beta, this release candidate only contains a fix in = the TSAN mode, and one metadata fix in the changelog itself. The full chang= e log for OCaml 5.4.0 is available on GitHub.

Happy hacking, Florian Angeletti for the OCaml team.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

opam update opam switch create 5.4.0~rc1

The source code for the release candidate is also directly available on:

Fine-tuned compiler configuration

If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.4.0~rc1+options <=
;option_list>

where <option_list> is a space-separated list of o= caml-option-* packages. For instance, for a flambda and= no-flat-float-array switch:

opam switch create 5.4.0~rc1+flambda+nffa ocaml-variants.5.4.0~rc1+options =
ocaml-option-flambda ocaml-option-no-flat-float-array

All available options can be listed with opam search ocaml-option.

Announcing the OCaml Zulip at ocaml.zulipchat.com

ancolie announced

Dear OCaml community,

There has been a recent renewed interest in maintaining an open, organized = and synchronous communication channel, and the OCaml Zulip has been revived= . It is freely readable without an account at ocaml.zulipchat.org, and can be accessed through various mea= ns of authentication, including Github accounts.

On Zulip, we have full access to our data at all time, and should the compa= ny change its policy, the data can be retrieved and the current version of = Zulip server is self-hostable. In the meantime, we have been graciously off= ered sponsorship as an open community and can enjoy all features of the pla= tform for free, and we thank Zulip for that.

The platform can be accessed either on the web (one tab per server), or on = the desktop and mobile client, which allow for managing multiple organizati= ons.

Talking about multiple organizations, there are already many OCaml, program= ming languages and verification related Zulip servers, such as Rocq, Types, Why3, Catala, Bytecode alliance, Owi or Aeneas= . Check-out the full list of open to the public communities for more.

Finally, we would like to emphasize that any governance team or project is = welcome to host their discussions on the Zulip, where a channel can be crea= ted and admin rights granted.

Cheers!

PS: For anyone already on the Zulip, as part of this effort, the URL was mi= grated from caml.zulipchat.org to ocaml.zulipchat.org and you may have to remove the server and login again.

An impressive macrobenchmark for eio

conroj said

While wandering around the web I came across a link to a slide deck by our own @ka= yceesrk. On slide #35 is a macrobenchmark showing an EIO-based network serv= er, and its throughput is pretty favorable compared to the Rust implementat= ion=E2=80=99s.

Taking this at face value, it seems like quite an achievement - not only be= cause GC is (supposedly) a handicap for OCaml, but also because this seems = like a major improvement over a similar benchmark from 2022. I couldn=E2=80=99t find links to deeper discussion of these r= esults, so I thought I would ask some of the obvious follow-up questions:

  • Is OCaml=E2=80=99s tail latency on par with Rust=E2=80=99s in these sce= narios?
  • Are both the =E2=80=9COCaml eio=E2=80=9D and =E2=80=9CRust Hyper=E2=80= =9D results using similar kernel capabilities, e.g. io_uring? = (The slide seems to suggest so, but just confirming.)
  • Do these results generalize to different levels of concurrency, request= /response sizes, etc?

Either way, kudos for raising OCaml=E2=80=99s profile as a platform for sca= lable computing!

Anil Madhavapeddy replied

They both used io_uring, yes. The OCaml bindings are at https://github.com/ocaml-multicore/= ocaml-uring ; but note that there are several levels of io_uring usage = possible depending on your tolerance for ranges of Linux kernel support (I= =E2=80=99m just adding zero-copy transmit support at the moment for a proje= ct involving a petabyte of data).

OCaml=E2=80=99s tail latency will be worse than Rust=E2=80=99s due to havin= g a GC, but not terribly so. As for generalization, those tests were run on= a pre-5.0 version of OCaml, so the whole test suite would have to be rebas= ed against the released versions. A good and useful exercise if someone wou= ld like to have a go at it!

Thomas Leonard also replied

I think the benchmarks are from https://github.com/ocaml-multicore/retro-httpaf-benc= h

I don=E2=80=99t think the Rust ones are using uring, but I=E2=80=99m not su= re. I suspect that all the non-OCaml ones could do with a fan of that langu= age optimising them a bit.

In my experience, whether the Rust or Eio version gets better throughput de= pends on e.g. the number of connections, and tail latency was always better= with Rust.

But the basic result is that OCaml is competitive with Rust here.

nim-ocaml

Florent Monnier announced

I read a paper maybe not this one, but it seems it talks about the same thi= ng https://arxiv.org/html/2506= .04657v1. At the beginning I thought it's about the new programming language, but the= n chatgpt explained me that in fact it's a small game with stones. We put a= given number of stones in the middle, and each player can take 1, 2 or 3 s= tones from the stack. There are two variants of the game, the one that only= has one stone in front of him at the end wins or not.

So I tryed to make a nim-ocaml to play against its Rando= m.state, here below:

let () =3D
  Random.self_init () ;
  let n =3D 13 + (Ran=
dom.int 23) in
  let _n =3D ref n =
in
  let run =3D ref true in
  while !run do
    Printf.printf "%d\n" !_n;
    if !_n <=3D 1 then run :=3D fal=
se ;
    let line =3D read_line () in
    begin
      try
        let d =3D int_of_string line in
        _n :=3D !_n - d ;
      with _ ->
        Printf.printf "please input an integer number\n%!";
    end;
    let b =3D Random.=
int 2 + Random.int 3 in
    Printf.printf "b played: %d\n" b;
    _n :=3D !_n - b ;
  done;
  Printf.printf "done!\n" ;
$ \ocaml nim.ml=20

Or later:

$ wget http://decapode314.free.fr/ocaml2/nim/nim.ml
$ \ocaml nim.ml
23
3
b played: 3
17
7
b played: 0
10
3
b played: 2
5
2
b played: 2
1
0
b played: 0
done!

Another version to play against your collegue at the pause:

$ wget http://decapode314.free.fr/ocaml2/nim/.gil/nim.ml.0

Call for Contributions: BOB 2026 (Berlin, March 13 - Deadline = Nov 17)

Michael Sperber announced

OCaml contributions are spot-on for BOB - send us some!

BOB Conference 2026 - Call for Contributions

=E2=80=9CWhat happens when we use what=E2=80=99s best= for a change?=E2=80=9D

Looking for Speakers

You are actively engaged in advanced software engineering methods, solve ambitious problem with software and are open to cutting-edge innovation? Attend this conference, meet people that share your goals, and get to know the best software tools and technologies available today. We strive to offer a day full of new experiences and impressions that you can use to immediately improve your daily life as a software developer.

If you share our vision and want to contribute, submit a proposal for a talk or tutorial!

NOTE: The conference fee will be waived for presenters. Travel expenses will not be covered (for exceptions see =E2=80=9CSpeaker Grants=E2= =80=9D).

Topics

We are looking for talks about best-of-breed software technology, e.g.:

  • functional programming
  • persistent data structures and databases
  • event-based modelling and architecture
  • =E2=80=9Cfancy types=E2=80=9D (dependent types, gradual typing, linear = types, =E2=80=A6)
  • formal methods for correctness and robustness
  • abstractions for concurrency and parallelism
  • metaprogramming
  • probabilistic programming
  • math and programming
  • controlled side effects
  • program synthesis
  • AI beyond vibecoding and chatbots
  • linked data
  • symbolic AI
  • next-generation IDEs
  • effective abstractions for data analytics
  • =E2=80=A6 everything really that isn=E2=80=99t mainstream, but you thin= k should be
  • =E2=80=A6 including rough ideas that are worth discussing.

Presenters should provide the audience with information that is practically= useful for software developers.

Challenges

Furthermore, we seek contributions on successful approaches for solving har= d problems, for example:

  • bias in machine-learning systems
  • digital transformation in difficult settings
  • accessibility
  • systems with critical reliability requirements
  • ecologically sustainable software development

We=E2=80=99re especially interested in experience reports.

Other topics are also relevant, e.g.:

  • introductory talks on technical background
  • overviews of a given field
  • demos and how-tos

Requirements

We accept proposals for presentations of 45 minutes (40 minutes talk + 5 minutes questions), as well as 90 minute tutorials for beginners. The language of presentation should be either English or German.

Your proposal should include (in your presentation language of choice):

  • An abstract of max. 1500 characters.
  • A short bio/cv
  • Contact information (including at least email address)
  • A list of 3-5 concrete ideas of how your work can be applied in a devel= oper=E2=80=99s daily life
  • additional material (websites, blogs, slides, videos of past presentati= ons, =E2=80=A6)

Submit here

Organisation

  • Direct questions to konferenz at bobkonf dot de
  • Proposal deadline: November 17, 2025
  • Notification: December 5, 2025
  • Program: December 12, 2025

Shepherding

The program committee offers shepherding to all speakers. Shepherding provides speakers assistance with preparing their sessions. Specifically:

  • advice on structure and presentation
  • review of talk slides

Speaker Grants

BOB has Speaker Grants available to support speakers from groups under-represented in technology. We specifically seek women speakers, speakers of color, and speakers who are not able to attend the conference for financial reasons.

ocp-indent 1.9.0

Nathan Rebours announced

Here at OCamlPro we=E2=80=99re happy to announce the (long awaited) release= of ocp-indent.1.9.0.

The full release notes are available here if you want the detailed version.

1.9.0 contains mostly bug fixes, better and more consistent indentation of = fun _ -> and |>, compatibility with cmdline= r.1.3.0 and above (it works with 2.0.0) and a new utility tool: ocp-i= ndent-gen-rules for those of you who would like to try ocp-ind= ent in a dune fmt like workflow.

This last bit is documented here.= This is a feature that some of us wanted internally at OCamlPro so we deci= ded to ship it with the tool as an experiment. We=E2=80=99d really like to = hear if this fits your ocp-indent usage so please don=E2=80=99t hesitate to= try it out and give us some feedback.

We=E2=80=99re also interested in hearing how you use ocp-indent in general = and what you expect from it. Reach out if you have any request!

We=E2=80=99ve also updated the repo to fit the more recent development stan= dards. We migrated the test suite to dune cram tests and re-enabled them in= opam. Hopefully this should make contributing to ocp-indent a smoother experience!

Also be aware that we=E2=80=99ll do our best to maintain ocp-indent more ac= tively from now on.

We=E2=80=99d like to thank our external contributors for this release: @dbu= enzli, @nojb, @bcc32 and @Julow.

Happy indenting!

Sketch.sh now supports OCaml 5.3.0

Javier Ch=C3=A1varri announced

The interactive OCaml sketchbook sketch.sh has added support for OCaml 5.3.0.

Existing sketches and forks

Previously existing sketches remain in their original compiler version, whi= le newly created sketches will be on 5.3.0 by default. For now, the only wa= y to "migrate" a sketch to a newer version of the compiler is by copying it= s content and pasting it in a new sketch.

Forked sketches inherit the compiler version of the upstream sketch.

Reporting features and issues

Please let us= know in case you have a feature request, or if you encounter any issue= s or bugs. Also, don't hesitate to reach out via Reason Discord or Discuss DMs if you would like to contri= bute or participate in the project in some way. There are a lot of opportun= ities to do so, both on the frontend and backend sides.

OUPS meetup october 2025

ancolie announced

The next OUPS meetup will take place on Monday, 13th of October 2025= . It will start at 6:30pm at the 4 place Jussieu in Paris. It= will be in the in the Esclangon building (amphi Astier).

Please, register on meetup as soon as possible to let us know how ma= ny pizza we should order.

For more details, you may check the OUPS= =E2=80=99 website .

Moreover, we'd like to announce that the organizing team moved to the OCaml Zulip. Feel free to contact us= there if you'd like to suggest talks.

This time we=E2=80=99ll have the following talks:

What's the deal with modular implicits ? – Samuel Vivien

Modular implicits est une extension d'OCaml pr=C3=A9sent=C3=A9e en 2014 com= me une solution =C3=A0 l'absence de type classe en OCaml. Cependant malgr= =C3=A9 l'anciennet=C3=A9 de cette proposition cette fonctionnalit=C3=A9 n'e= st toujours pas disponible dans OCaml. Nous ferons un tour d'horizon de mod= ular implicits pour rappeler comment cette fonctionnalit=C3=A9 marche, ce q= ui as d=C3=A9j=C3=A0 =C3=A9t=C3=A9 impl=C3=A9ment=C3=A9 dans le compilateur= mais aussi ce qu'il reste =C3=A0 faire ainsi que les probl=C3=A9matiques l= i=C3=A9s au typage des implicites.

Flambda2: Abstractions without Cost – Guillaume Bury

Surprise.

After the talks there will be some pizzas offered by the OCaml Software Foundation and later on we=E2=80=99ll mov= e to a pub nearby as usual.

New releases of Merlin (5.6) and OCaml-LSP (1.24.0)

Xavier Van de Woestyne announced

We are pleased to announce new releases of Merlin (5.6-504 and 5.6-503) and OCaml-LSP (1.24.0, fo= r 5.4, and 1.23.1)!=20

This release of Merlin offers, firstly, support for OCaml 5.4<= /code>. It improves support for OpenBSD (for merlin-reader), i= mproves typing recovery in the handling of mutual recursion, and adds a new= feature to the protocol: locate-types. It works similarly to = locate-type, except that it allows you to distinguish between = several locatable types in an expression l= ike this: (int, Foo.t) result enabling the location of: = int, Foo.t and ('a, 'b) result. In additio= n, the Vim client has been fixed for the use of project-wide-occurren= ces.

The release of OCaml LSP also mainly concerns support for 5.4<= /code> and several bug fixes.

As with every version upgrade, we are eager to hear user feedback. T= ry out these new releases on your 5.4 switches and don't hesit= ate to report any issues you encounter (Merlin, OCaml LSP)!

Merlin Changelog

  • Merlin 5.6-504 (& 5.6-5= 03)
    • merlin binary
      • Add locate-types command (#1951)
    • merlin library
      • Fix merlin_reader for OpenBSD (#1956)
      • Improve recovery of mutually recursive definitions (#1962, #1963, fixes= #1953)
      • Support for OCaml 5.4 (#1974) (only for 5.6-504)
    • vim plugin
      • Fix error when :MerlinOccurrencesProjectWide fails to gath= er code previews (#1970)
    • test suite
      • Add more short-paths tests cases (#1904)

OCaml LSP Changelog

  • 1.24.0 & 1.23.1<= br />
    • features
      • Support for OCaml 5.4 (#1559)
    • fixes
      • Fix hover on method calls not showing the type. (#1553, fixes #1552)
      • Fix error on opening .mll files (#1557)
      • Ensure compatibility with both yojson 2.0 and 3.0. (#1534)

    Happy Hacking! The Merlin Team :man_mage: :two_hump_camel:

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 loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

--=-=-=--