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=k8nVtgwi; 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]) by plum.tunbury.org (Postfix) with ESMTP id 59B9740099 for ; Tue, 8 Sep 2026 13:21:11 +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=gI9oqynihyFmpocHNyv/hPO8PvdslaXp2Srcz3Y/KU4=; b=k8nVtgwiIzkucDYlyuBBrPlmL+BTt7r9rP2lIL5uSiXBFRPITyMbnDVP Httn04ZA74jIkLLfLJXxi5LR8+5aGpweFMZ7H/cW0lWi9zZ8ms3VS5PAu UTkcUISvjCTOHWd81yIYvLnNSwngBJJW/pR5LSaMqdYpTheCnsnR4Woc0 s=; X-CSE-ConnectionGUID: DaI5A457Rn2OCj2e+TRA1g== X-CSE-MsgGUID: dB2xH58+SjydzBMcThYf0w== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; 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 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@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.25,268,1779141600"; d="asc'?scan'208,217";a="293775266" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 08 Sep 2026 15:21:06 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 11805816F4; Tue, 8 Sep 2026 15:21:06 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 4DBD4814FC for ; Tue, 8 Sep 2026 15:20:58 +0200 (CEST) X-CSE-ConnectionGUID: H1WbTJC7SeGpiGo/TPOF9A== X-CSE-MsgGUID: w+1wLW/pRDSeWvLzeq0a3A== IronPort-SDR: 6aa00bb7_qO4OTkciGaaGGJW/6BmH9Tj5+zs1LKa9+XtObVK9b2jyhHj M80yp7RDI07cyWxt4SXxQi3uHmBiBtkrRwg16Fw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EQBgDnCaBqhSIeaIFSCBwBAQEBAQEHAQESAQEEBAEBg?= =?us-ascii?q?hCBPVspGwFuYTMHCEmEHDyDT44kgRaQN4p8DYJsAxgWIQIOBwEDAQgFLgEVC?= =?us-ascii?q?gECBAEBAQIBAgGCC4ItRgKOBAIfBgEENBMBAgQDAgMBAQEBAQEBAQEBAQsBA?= =?us-ascii?q?QEEAQEBAgEBAgQDAQEBAQIQAQEBAUBJhk8NjAdRUx5gAQMBAgEFAQYBAQEBA?= =?us-ascii?q?QEBAQEBAQEBASIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAgQEBAEjH04OAQgEBhMBASMVGBQPAxQBBgMCEQE1AwETARIUB?= =?us-ascii?q?QGCEFgBgiACAlADBQwGpy2bI3p/M4EBggwBAQaBCD4DDwMBDgkm2hqBYQkJF?= =?us-ascii?q?YE4gViEGYJRDw0BBSMCSVIYAgEChDEghEEnD4FVRIEVNYFXHUoHb4JKFwEBA?= =?us-ascii?q?QEYREwPBQEBAkoBCYMlgmqCERWBDIE8PFAZAQaBJYNBgyuIeYJCLAFVExcLB?= =?us-ascii?q?wVegQgDKi8tbjIdgSM+Fy9YGwYFgR2BJ4M/Ixk2eoEJXoErKWESF4EJgggCg?= =?us-ascii?q?lSCAQIBSUMOB0VTCSdLEgwLbT03FRmNQhAhDYFDSBkfggoKBBINDgsGAQEsE?= =?us-ascii?q?CQDFw4FAQoJCAcDAwECBBYGAg0hBAQoBQwKGR0JBQYDBAwLAg4ZBgEIAgIJA?= =?us-ascii?q?hwRA4RgiC2FNgsJJQMjBwEEco5mAYNWikOTWR1tNAeEIYFgBgyJCoEmjjSHU?= =?us-ascii?q?4QETYEKiz2HA5E2gRwimGYjgjaHKIEmCYFvH0yIeYEUixcQJgYICwOFQ4F/I?= =?us-ascii?q?4FJDAczGjAiIYJnCUccD1cBiwmCQQkDFoM4KBCBLoEmgXQXJMcIQjUCAQEHN?= =?us-ascii?q?AcCBwEMBIVrAQFpi1FrYQEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:d1yLMaycT+9SIc0pIw2sKrPwHb1zdoMgy1knxilNoG9uE/Bw9v rFoB1173PJYVoqKRIdcLO7V5VoI0mwyXek2/h1AV7KZmCP01dARLsSibcKqAeQeREWmNQ86U 4tScZD4IqaNykdsS6kizPIaurIauP3iJxA0t2uqEtQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3Azmz3CmlugO0/kH/pr1Xen1ORZVvXOV2E833sAWT?= =?us-ascii?q?nMmtGULy6ThiswIRKwuM7zg=3D=3D?= X-Talos-MUID: 9a23:nUhaRgbkXWBg/uBTqHy1mxVdc99Sz5+jN14pg5gf48DfHHkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.25,268,1779141600"; d="asc'?scan'208,217";a="156257203" X-URL-ContentFilter: X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-MGA-submission: =?us-ascii?q?MDG9ymC+3SsjNLCNCfX4lQjGKVZ70Z0+T1Oj3Z?= =?us-ascii?q?90BludUzh/8wtesXYAqTaNxXJKgjdE+4kmGBxyjllXE0ehcHHaeHoytt?= =?us-ascii?q?TdThVq5JM81BLQ7aZFmupadDNJsvhAP7BnJB8P3Ta3hlD3zFBGyAosww?= =?us-ascii?q?KzVOxpjHE+18EeP0WI813DiA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Sep 2026 15:20:55 +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 403491A465; Tue, 8 Sep 2026 15:20:54 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 08 Sep 2026 15:20:53 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 8 15:20:54 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499841, queueID=6BC071A483 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: 19573 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: 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 September 01 to 08, 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 Working in the OCaml compilers backend forcamla 0.4.0 - Simple Functional Reactive Programming Typegist 0.0.0 Dependent if expressions without dependent types Caps 0.1.0, a capability type system and library for OCaml bstr, slice and bin (bigstring, encoders and decoders for binary formats) OCaml 5.5.1 released Slipshow! ocp-indent 1.10.0 Intel ISA specification interpreter/compiler is written in OCaml TyXML 5.0.0 Old CWN Working in the OCaml compilers backend =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Zane Hambly 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 Hello! long time lurker, first time caller here. I've been working in the OCaml backend mainly in native emission and `asmcomp' swapping out calls to C for instructions for each architecture the compiler supports. Some of the work was sponsored by OCSF but I have also been trying to make myself useful in other projects too. I have done a full write up on my [website]. Because my work has also involved adding native atomics, I've been doing litmus testing on OCaml's memory model. If you are interested in seeing the results, I've also added a page [here]. This is something I plan on updating from time to time alongside some other tests I have planned. I have access to a whole pile of machines so I might as well use them! I come mainly from a hobbyist and historical computing background and have used OCaml extensively to help me in those endeavours. I plan on continuing my work on the compiler so you may see me around reviewing pull requests or sending my own in. If you have any questions, please feel free to ask! Thanks, Zane [website] [here] forcamla 0.4.0 - Simple Functional Reactive Programming =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Christopher Sumnicht 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 Hi everyone, I also made this package a bit ago (didn't know about discuss.ocaml.org until yesterday) called [forcamla] ([opam]). You can think of it like a very powerful spreadsheet editor. In particular, in forcamla we /equate/ variables instead of /assign/ them. forcamla also combines the power of spreadsheets with event listeners to organize program execution. [forcamla] [opam] A Small Example =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=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 open Formula (* To use formula *) =E2=94=82=20 =E2=94=82 let x =3D v 2 (* Create an integer term called x *) =E2=94=82 let y =3D v 2 (* Create an integer term called y *) =E2=94=82 let z =3D x + y =E2=94=82 let () =3D x =3D: 3 (* Set x to 3, and z now is 5 *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Observe there is no need to reassign `z'. It was /equated/ to `x + y' and will always update whenever `x' or `y' change. Event Listeners =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=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 can also construct event listeners using this framework. Here is a small game example to illustrate this: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Formula =E2=94=82=20 =E2=94=82 type hero =3D =E2=94=82 { =E2=94=82 (* A bunuch of fields *) =E2=94=82 health: int formula =E2=94=82 } =E2=94=82=20 =E2=94=82 let player =3D =E2=94=82 { =E2=94=82 (* Assign the fields *) =E2=94=82 health =3D v 3; (* Give health a value of something, say 3 in= this case. *) =E2=94=82 } =E2=94=82=20 =E2=94=82 let game_over () =3D print_endline "Game Over!" =E2=94=82 let () =3D when_satisfied (player.health =3D? 0) game_over =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Then you can do this: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let () =3D player.health =3D: !(player.health - c 1) (* Nothing= happens yet! player.health is 2 now. *) =E2=94=82 let () =3D player.health =3D: !(player.health - c 1) (* Nothing= happens yet! player health is 1 now. *) =E2=94=82 let () =3D player.health =3D: !(player.health - c 1) (* Now som= ething happens! player.health is 0 and "Game Over!" is printed to the scree= n! *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Why? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C I originally designed forcamla for games but I realized it is just a useful organizational tool in general. It is similar to Jane Street's [Incremental] but forcamla prioritizes ergonomics over efficiency. [Incremental] Typegist 0.0.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 Archive: Daniel B=C3=BCnzli 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, It's my pleasure to announce the first release of `typegist': Typegist represents the essence of OCaml types as values. This dynamic type representation can be used to devise generic type-indexed functions =E2=80=93 value serializers, printers, parsers, differs, random generators, editors, ffi glue, etc. Any accessible type can be described up to the limits defined by its public interface. Typegist does not model OCaml's type language in full detail, but focuses on a core structural subset decorated with typed-indexed metadata to provide an ergonomic interface for both producers and processors of the representation. Typegist is distributed under the ISC license. It has no dependencies. As mentioned above these values only partially model OCaml's type definition language, that's the reason why they are `Type.Gist.t' and not `Type.Repr.t' values. You should see typegist as a data interfacing language for your types rather than a faithful or canonical representation of your types (which I find less useful in practice). The representation special cases and annotates some of the `Stdlib' types: being too generic and losing all semantics in favour of generalized abstract non-sense is undesirable when you interface with other systems. For example. You want `list' values to show up as arrays in JSON, not as nested cons case objects. You want `None' to map to `null' not to a constant case object. You want `string' values that hold textual data to show up as plain JSON strings rather than hex digits or base64. Etc. This means that part of [the representation] is decidedly ad-hoc. It balances precision and genericity while making it [reasonably easy] to devise your own gist processors without getting bogged into pointless details of OCaml's type expression language. So next time it's time for you to write an `M.pp : t Fmt.t' function, write an `M.gist : t Type.Gist.t' instead. You'll get your printer and [more]. A companion release of `jsont' was made with the new optional `jsont.typegist' library that [translates] type gists into `jsont' JSON types for your JSON serialization pleasure (if that exists). While I don't expect typegist to change much, it hasn't been used in anger yet =E2=80=93 but I'll waste no time. It's again a design that has = been rotting for too long in a repo. This means that changes in the representation could still occur based on feedback if more precision is needed or better representation are found. However I'd expect such changes to mostly affect gist processors. Get in touch on the issue tracker if you run into difficulties or improvements. I have no plan to propose any mean to automate gist derivations from type definitions, but some people have expressed interest in doing that in the past. Happy typed-indexed programming! This first release was made possible thanks to a grant from the [OCaml Software Foundation]. I also thank my [donors] for their support. =E2=80=A2 Homepage: =E2=80=A2 Docs: or `odig doc typegist' =E2=80=A2 Install: `opam install typegist' ([opam PR]) Best, Daniel =E2=80=94 P.S. The API makes use =E2=80=93 for good =E2=80=93 of every ne= w type gimick that was introduced in OCaml 5.5 :=E2=80=93) [the representation] [reasonably easy] [more] [translates] [OCaml Software Foundation] [donors] Dependent if expressions without dependent types =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Didier Wenzek 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 This [post on Haskell for all] shows an insighful use of Church encoding to implement dependent if expressions without dependent types. The following OCaml code type checks and works: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # let example bool =3D if_then_else bool 5 "hi!";; =E2=94=82=20 =E2=94=82 # example t;; =E2=94=82 - : int =3D 5 =E2=94=82 # example f;; =E2=94=82 - : string =3D "hi!" =E2=94=82 # example (f && t);; =E2=94=82 - : string =3D "hi!" =E2=94=82 # example (f || t);; =E2=94=82 - : int =3D 5 =E2=94=82 # example (not t);; =E2=94=82 - : string =3D "hi!" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is simply based on Hindley-Milner type inference, with a single trick that is to be not too restrictive on the type for Church encoded booleans. Where the first idea to Church encode booleans would be to restrict the `then' and `else' cases to be the same (using a record to encode the forall type): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type bool =3D { check : 'a. 'a -> 'a -> 'a; } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dependent if expressions require a liberal definition: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type bool =3D { check : 'a 'b 'c. 'a -> 'b -> 'c; } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 And this is what is inferred when no type is enforced (ignoring the fact we get then weakly polymorphic types instead of forall types): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let t if_branch else_branch =3D if_branch =E2=94=82 let f if_branch else_branch =3D else_branch =E2=94=82=20 =E2=94=82 let if_then_else bool if_branch else_branch =3D bool if_branch = else_branch =E2=94=82=20 =E2=94=82 let (&&) a b if_branch else_branch =3D a (b if_branch else_bran= ch) else_branch =E2=94=82 let (||) a b if_branch else_branch =3D a if_branch (b if_branch= else_branch) =E2=94=82 let not a if_branch else_branch =3D a else_branch if_branch =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I encourage you read the full post, this is a really nice read. [post on Haskell for all] Caps 0.1.0, a capability type system and library for 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=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =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: Yoann Padioleau 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 pleased to announce the first release of the caps library, which allows you to use /capability types/ in your OCaml programs (and libraries). The main idea is that after you used this library, your functions can have signatures like =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val foo: < Cap.network; Cap.stdout; Cap.random; .. > -> =E2=94=82 int -> float =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 meaning this function requires the /network/, /stdout/, and /random/ capabilities to work. The signature reveals the internal /effect/ this function has and the kind of system calls it internally does (or its callees), I designed this library while working at Semgrep on the semgrep codebase and it was useful to /sandbox/ or control parts of the codebase so that young engineers would not call dangerous functions in certain parts. It is I think even more useful in the new coding-agent era to control in the signature the code generated by AI. For more information you can see my talk at the OCaml 2026 workshop here: as well as the corresponding slides (using the super cool Slipshow presentation tool announced here a few times). See also the project page at You can easily play with it by installing it via opam: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam update =E2=94=82 $ opam install caps =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Happy to answer questions. bstr, slice and bin (bigstring, encoders and decoders for binary formats) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Calascibetta Romain 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 am delighted to announce the release of [`bstr.0.1.0'], as well as `bin.0.1.0' and `slice.0.1.0'. These releases are the result of a synthetic work between several libraries, aimed at bringing together everything that might be useful to us in implementing formats and protocols within [our cooperative]. In particular, these libraries offer: =E2=80=A2 a comprehensive module for manipulating what are known as _bigstrings_ (replacing [bigstringaf] - because the name of that library is too long) =E2=80=A2 a library providing access to bigstrings and bytes (in short, [= an abstraction] of [ocaml-cstruct]) =E2=80=A2 finally, a library for describing binary formats from which one= can derive an encoder and a decoder (in the spirit of what [repr] can offer) For those who want to understand the benefits of bigstrings, I=E2=80=99ve previously shared my thoughts on the subject [here]. Although we=E2=80=99= ve since backtracked on the use of `ocaml-cstruct', particularly for performance reasons (see [this article]), bigstrings remain useful in certain cases: they should, fundamentally, be used wisely. Particular attention has been paid to performance using [`bechamel'] (for micro-benchmarking), and we can draw a few conclusions from this: =E2=80=A2 `bstr' has the edge over `bigstringaf' as it uses tags that did= not exist at the time `bigstringaf' was developed =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81 bstr bigstringaf=20 =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 blit 4.4ns 4.8ns=20=20=20=20=20=20=20 sub 15.4ns 18.9ns=20=20=20=20=20=20 =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81 =E2=80=A2 `slice.bstr' performs like `ocaml-cstruct' (which was to be expected) =E2=80=A2 `bin' challenges hand-written code in terms of decoding =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81 bin hand-written (`ocaml-cstruct') `repr' `angstrom'=20 =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 ipv4 11.9ns 11.9ns 93.9ns 136ns=20=20=20= =20=20=20 =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let bin =3D =E2=94=82 let fn vihl tos total_length id ff ttl protocol checksum sr= c dst =3D =E2=94=82 { version=3D vihl lsr 4; ihl=3D vihl land 0x0f; tos; tota= l_length; id =E2=94=82 ; flags=3D ff lsr 13; frag_offset=3D ff land 0x1fff; ttl;= protocol; checksum =E2=94=82 ; src; dst } =E2=94=82 in =E2=94=82 let open Bin in =E2=94=82 record ~name:"ipv4" fn =E2=94=82 |+ field ~name:"vihl" uint8 (fun t -> (t.version lsl 4) lor= t.ihl) =E2=94=82 |+ field ~name:"tos" uint8 (fun t -> t.tos) =E2=94=82 |+ field ~name:"total_length" beuint16 (fun t -> t.total_le= ngth) =E2=94=82 |+ field ~name:"id" beuint16 (fun t -> t.id) =E2=94=82 |+ field ~name:"flags_frag" beuint16 (fun t -> =E2=94=82 (t.flags lsl 13) lor t.frag_offset) =E2=94=82 |+ field ~name:"ttl" uint8 (fun t -> t.ttl) =E2=94=82 |+ field ~name:"protocol" uint8 (fun t -> t.protocol) =E2=94=82 |+ field ~name:"checksum" beuint16 (fun t -> t.checksum) =E2=94=82 |+ field ~name:"src" beint32 (fun t -> t.src) =E2=94=82 |+ field ~name:"dst" beint32 (fun t -> t.dst) =E2=94=82 |> sealr =E2=94=82=20 =E2=94=82 let cstruct cs =3D =E2=94=82 let vihl =3D Cstruct.get_uint8 cs 0 in =E2=94=82 let tos =3D Cstruct.get_uint8 cs 1 in =E2=94=82 let total_length =3D Cstruct.BE.get_uint16 cs 2 in =E2=94=82 let id =3D Cstruct.BE.get_uint16 cs 4 in =E2=94=82 let ff =3D Cstruct.BE.get_uint16 cs 6 in =E2=94=82 let ttl =3D Cstruct.get_uint8 cs 8 in =E2=94=82 let protocol =3D Cstruct.get_uint8 cs 9 in =E2=94=82 let checksum =3D Cstruct.BE.get_uint16 cs 10 in =E2=94=82 let src =3D Cstruct.BE.get_uint32 cs 12 in =E2=94=82 let dst =3D Cstruct.BE.get_uint32 cs 16 in =E2=94=82 { version=3D vihl lsr 4; ihl=3D vihl land 0x0f; tos; total_= length; id =E2=94=82 ; flags=3D ff lsr 13; frag_offset=3D ff land 0x1fff; ttl; p= rotocol; checksum =E2=94=82 ; src; dst } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 These libraries were driven by the ambition to provide a coherent and consistent set of libraries, particularly for working with bigarrays, whilst making few compromises in terms of performance. [Several attempts] were made to experiment with functors, GADTs, ADTs and even higher-kinded polymorphism=E2=80=A6 (even with capabilities). The result is that a _poor man=E2=80=99s functor_ appears to be sufficien= t, along with a few tweaks (notably to avoid a few `caml_apply2' calls), to achieve something that is fairly competitive compared to hand-written code. These libraries also encapsulate what may have been missing and/or emerged within the community when it came to working with bigstrings. I have personally contributed to improving these libraries without being entirely satisfied with them: hence the emergence of `bstr' in particular. A considerable amount of effort has been put into documenting these libraries and into testing them. Fuzzers are also available to verify certain assertions regarding `bin' (such as isomorphism). These libraries are currently in use, and this version is certainly not the final one. Indeed, we will continue to improve them as we use them (particularly with regard to the implementation of protocols and formats in OCaml). If you appreciate our work, you can make a donation [via GitHub] or directly to [our charity]. Bighappy hacking! [`bstr.0.1.0'] [our cooperative] [bigstringaf] [an abstraction] [ocaml-cstruct] [repr] [here] [this article] [`bechamel'] [Several attempts] [via GitHub] [our charity] OCaml 5.5.1 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=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 We have the pleasure of celebrating the birthday of Giovanni Girolamo Saccheri by announcing the release of OCaml version 5.5.1. This patch-level release fixes a major type system bug for module-dependent functions and also contains two security fixes for the runtime: one in the Marshal module, another inside the loading of bytecode. At a less severe level, this release also fixes two bugs in the runtime for concurrent programs, another runtime bug for musl users; and a handful of other bugs. The release also restores support for cloning the compiler on macOS. Overall, we are strongly advising you to switch to OCaml 5.5.1 if you were already using OCaml 5.5.0. The full list of bug fixes is available below for more details. Happy hacking, =E2=80=93 Florian Angeletti, for the OCaml team. 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: =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 5.5.1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the release is also directly available on: =E2=80=A2 GitHub: ) =E2=80=A2 Inria archive: Changes compared to OCaml 5.5.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=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=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 Type system =E2=80=A2 [14891], [14982]: fix scope error leading to an erroneous typechecking for non-dependent application of module-dependent function in presence of dependent first-class module types: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module type T =3D sig module type S end =E2=94=82 let f (module M:T) (m: (module M.S)) =3D m =E2=94=82 module type P =3D sig type 'a t end =E2=94=82 let error =3D =E2=94=82 f (module struct module type S =3D P end) (module List) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 (Florian Angeletti, report by Hazem ElMasry, review by Gabriel Scherer) [14891] [14982] =E2=97=8A Runtime =E2=80=A2 [14872]: harden loading of bytecode executable files against corrupted or malicious files having 2^29 TOC entries or more. (Xavier Leroy, review by Nicol=C3=A1s Ojeda B=C3=A4r) =E2=80=A2 [15019]: `Marshal.from_{string,bytes}': guard against overflow = in the computation of the total data length. (Xavier Leroy, report by Akshay Singh, review by Nicol=C3=A1s Ojeda B=C3=A4r and Antonin D=C3=A9= cimo) =E2=80=A2 [14933]: Respect `sysconf(_SC_SIGSTKSZ)' when choosing the size= for the alternate signal stack, avoiding fatal errors when linked against musl libc on some Intel CPUs. (Nat Mote, review by Florian Angeletti and Miod Vallat) =E2=80=A2 [14940], fix a memory leak in the OCaml runtime by bounding the= size of the internal cache of stacks. (Vesa Karvonen, Florian Angeletti, review by Gabriel Scherer) =E2=80=A2 [15029]: Fix a regression on Windows where an OCaml thread that never yielded voluntarily would keep the runtime lock forever, so that the other threads of its domain never ran. Preemptive switching between systhreads had no effect; only explicit calls to `Thread.yield' or blocking sections would let other threads run. (Nicol=C3=A1s Ojeda B=C3=A4r, report by Daniel Larraz, review by Antonin D=C3=A9cimo) [14872] [15019] [14933] [14940] [15029] =E2=97=8A Build system =E2=80=A2 [14883], [14884]: fix Windows cross-compilation with older mingw32-gcc versions (Brian Ward, review by Antonin D=C3=A9cimo and Stefan Muenzel) =E2=80=A2 [14871], [14914]: Ignore OCAMLTOP_INCLUDE_PATH during the build. (David Allsopp, report by Andreas Rossberg, review by Florian Angeletti) =E2=80=A2 [14901], [14923]: Fix the generated installation script to cope= with macOS's geriatric version of bash when executing in opam's sandbox. (David Allsopp, report by Julian Fondren and Sacha-=C3=89lie Ayoun, investigation and initial fix by Kate Deplaix, review by Florian Angeletti) =E2=80=A2 [14989]: Improve build reproducibility by letting only otherlibs/{str,unix} build their own .cmi and .cmx. The generic %.cmi/%.cmx rules of the root Makefile were racing with them under make -j and recorded a different source path, which changed the interface digest (and, through it, most other compiled artefacts) as well as the debug info packed into str.a and unix.a. (Bernhard M. Wiedemann, review by David Allsopp and Stefan Muenzel) [14883] [14884] [14871] [14914] [14901] [14923] [14989] =E2=97=8A User interface =E2=80=A2 [14881], [14882]: fix printing of external types that are subje= ct to module constraints. (Stefan Muenzel, review by Florian Angeletti) [14881] [14882] =E2=97=8A Runtime events library =E2=80=A2 [14966]: add the missing EV_MINOR_EPHE_CLEAN constructor to Runtime_events.runtime_phase, introduced in [13643]. The runtime has emitted this phase since 5.4, when a minor collection has to clean locked ephemerons, but the OCaml type had no constructor for it, so consumers were handed an out-of-range value and crashed when matching on it. (Tim McGilchrist, review by Florian Angeletti) =E2=80=A2 [14969]: Fix the units of the runtime events counter EV_C_MINOR_ALLOCATED_WORDS to report as the number of words of minor heap consumed, including headers. (Tim McGilchrist, review by Nicol=C3=A1s Ojeda B=C3=A4r) [14966] [13643] [14969] Slipshow! =E2=95=90=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: Continuing this thread, Paul-Elliot 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=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Another release was just [merged] in opam! Did you notice the trembling glass of water? That's the next release of Slipshow that I'm announcing: [merged] Slipshow 0.13.0: Juraslip Park =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C While digging in decades-old software, I found bugs that contained the DNA of the now extinct Keynoplodocus, Googloslideraptor, and last but not least, Powerpointaurus Rex. By merging it in Slipshow's own DNA, I was able to bring back to life features long forgotten by every modern software (like Slipshow): the ability to place elements in your presentation using the mouse. The main new attraction of this release is the "GUI mode". Until now, Slipshow placed every element for you, based on what it is (a title, a paragraph, a block) with CSS as escape hatch. This is the "What You See Is What You Mean" model. In "What You See Is What You Get", by contrast, you directly edit the rendered content and lay your elements out there, usually with the mouse. The best of both (Jurassic) worlds would be "What You See Is What You Want": deciding per element which of the two modes you prefer. Just as some frogs can change sex in a single-sex environment, a Slipshow element can now turn from WYSIWYM to WYSIWYG and be placed with the mouse, with a single `gui' attribute: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 {gui} =E2=94=82 Drag me, resize me. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Other notable improvements include Ctrl+clicking on the rendered content to get to the source, the addition of the [Tachyons] CSS framework, more consistent shortcuts, and some quality of life improvements in the drawing editor. As usual, I thank all [contributors] =F0=9F=92=9A, my [sponsor] =E2=9D=A4= =EF=B8=8F, and [NLnet for a generous grant] =F0=9F=92=9D that made all this work possible! Here is the full changelog: [Tachyons] [contributors] [sponsor] [NLnet for a generous grant] Added =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 "What You See Is What You Want": positions any "GUI" element absolutely, by dragging it in the preview! Supports moving, redimensioning and scaling elements. (#270) =E2=80=A2 "Go to source" by ~Ctrl~+clicking (or ~Cmd~+clicking on Mac) anywhere in the preview. (#270) =E2=80=A2 Added [tachyons] support (#278) [tachyons] Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Improved toolbar and shortcut consistency, notably in recording manager mode, `Shift+R' now closes the recording manager (previously it started a recording). `Shift+S' is used to start a recording. (#270) =E2=80=A2 Diagnostics on `slipshow compile' are sorted by location (#277) =E2=80=A2 Improve location of "Wrong Type" diagnostic (#277) =E2=80=A2 Hint that step counter and toc entries are clickable. (#278) =E2=80=A2 Pressing play in drawing editor when the cursor is at the end o= f the recording now replays from the beginning. (#278) =E2=80=A2 Round sub-millisecond time precision in drawing editor. (#278) Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 LSP: =E2=80=A2 Respect UTF-16 position encoding when it is the only one supp= orted by the editor. (#270) =E2=80=A2 Fix a bug in detection of element at cursor, and one in locat= ions of "glued" attribute, in effect improving hover and highlight reliability. (#270) =E2=80=A2 Fix `go_next' / `go_previous' doing nothing in "refresh on sa= ve" mode. (#270) =E2=80=A2 Fix frontmatter error sometimes not being reported (#277) =E2=80=A2 Fix locations reported for frontmatter `attributes:'. (#271) =E2=80=A2 Fix drawings being drawn behind positioned elements. (#270) =E2=80=A2 Fixed standalonity of html by embedding mono fonts (#272) =E2=80=A2 Resolution of css and js files in frontmatter are now relative = to the file they are in (and not to the root file). (#271) =E2=80=A2 LSP: correctly refresh on changes on files mentioned in frontma= tter (such as css and js files). (#271) =E2=80=A2 Improve uri vs local path detection. (#271) =E2=80=A2 Improve locations of errors in `css:' and `js:' frontmatter fields. (#271) =E2=80=A2 Allow spaces and tabs after frontmatter delimiters. (#275) =E2=80=A2 Fix drawing replay in editor stuck on a pause. (#278) =E2=80=A2 Fix last point of a stroke not being displayed when the recordi= ng ends at this time. (#278) =E2=80=A2 Group a slide's entrance with its own heading in the table of contents (#273) Docs =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Added documentation on the new GUI mode (#270) ocp-indent 1.10.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 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're happy to announce the release of `ocp-indent.1.10.0'. The full release notes are available [here] if you want the detailed version. The main feature of this release is the support for new OCaml language features from 5.3 effect patterns to 5.5 `let type' or `let class'. All new syntax introduced in the last 3 minor compiler releases are now properly supported. It also comes with new yet long awaited features such as a `--check' mode which simply verifies whether the input file is correctly indented and a complementary `--strict' flag which makes `ocp-indent' warnings fatal, both intended for CI use. As usual there's also a bunch of bug fixes: `-' is now correctly accepted as a positional argument for `' input, `strict_with' behaviour has been improved to be consistent across types and type extensions and starred comments are now correctly indented. We'd like to thank Ahrefs who's funded this release through their [grant program]! May your .ml files be properly indented :pray: [here] [grant program] Intel ISA specification interpreter/compiler is written in 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=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Edwin T=C3=B6r=C3=B6k 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 Intel has recently published a beta executable specification for its ISA: . Although approximations for an ISA specification have existed before (e.g. in [ACL2 or SAIL]), they were constructed based on the manual in prose form (which [had bugs in the past]). Having the specification published in an executable language (and hopefully tested!) by the vendor itself is a welcome improvement. Even better, I just noticed that the [interpreter/compiler] for the specification language is written in OCaml! [ACL2 or SAIL] [had bugs in the past] [interpreter/compiler] TyXML 5.0.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 Archive: Vincent Balat 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 are happy to announce *TyXML 5.0.0*, a major release. TyXML builds HTML and SVG documents whose validity is checked by the OCaml type system: an element the specification does not allow in a given position does not typecheck. The library now follows the current specifications, the WHATWG living standard for HTML and SVG 2 with the Filter Effects module, where SVG support had not moved since SVG 1.1. Highlights: =E2=80=A2 *HTML*: popover, invoker commands, microdata, declarative shado= w DOM and CSS shadow parts, `loading~/~decoding~/~fetchpriority', `blocking', the new elements `s', `bdi', `search', `data', `slot' and `track', the event handler attributes that were missing (the pointer family, clipboard, `ontoggle', `onscrollend' and friends), and content models brought in line with the standard. =E2=80=A2 *SVG*: `mask' was declared in `Svg_types' but the element itsel= f was missing, `feMerge' could be given no child because `feMergeNode' did not exist, and about thirty presentation attributes had a type tag but no function to produce them. All of those are in, together with the SVG 2 additions, ARIA support, the SVG 2 link attributes, and content models widened to SVG 2. =E2=80=A2 *The PPX and JSX syntaxes*: no camel case SVG attribute was recognised, so `viewBox', `stdDeviation', `preserveAspectRatio' and most others were rejected, which means most real SVG could not be written with the PPX at all. Whitespace between SVG tags is also ignored now where the content model does not accept text, so indented SVG typechecks. =E2=80=A2 *Constructs that no program could actually use* are fixed: `are= a' had no `href' and its tag was in no content model, so a `map' containing areas fitted nowhere; `symbol' accepted no core attributes, hence no `id' and no way to reference it; the `li' children of `menu' could not be built. Several attribute names were also emitted misspelled, which is worse than a compile error since the output looks fine. Breaking changes worth knowing about: `hidden' and `contenteditable' take an enumerated argument, the URL-valued attributes go through `Xml.uri', SVG documents are printed without the SVG 1.1 doctype, `Wrapped_functions' has four new functions for implementers of the functorial interface, and the build requires OCaml 4.08, dune 3.18 and ppxlib 0.36. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install tyxml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Blog post with the details: =E2=80=A2 Changelog: =E2=80=A2 Manual and API: Thanks to everyone who contributed to this release, in particular Hugo Heuzard, Martin Bodin, toastal, Sylvain Boilard, rand00, Sora Morimoto, Patrick Ferris and Gabriel Radanne. Bug reports and pull requests are welcome on . 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 01 to 08, 2= 026.

Working in the OCaml compilers backend

Zane Hambly announced

Hello! long time lurker, first time caller here.=20

I've been working in the OCaml backend mainly in native emission and = asmcomp swapping out calls to C for instructions for each architectu= re the compiler supports. Some of the work was sponsored by OCSF but I have= also been trying to make myself useful in other projects too.=20

I have done a full write up on my = website.

Because my work has also involved adding native atomics, I've been doing li= tmus testing on OCaml's memory model. If you are interested in seeing the r= esults, I've also added a page here. This is something I plan on updating from time to = time alongside some other tests I have planned. I have access to a whole pi= le of machines so I might as well use them!

I come mainly from a hobbyist and historical computing background and have = used OCaml extensively to help me in those endeavours. I plan on continuing= my work on the compiler so you may see me around reviewing pull requests o= r sending my own in. If you have any questions, please feel free to ask!=20

Thanks,

Zane

forcamla 0.4.0 - Simple Functional Reactive Programming

Christopher Sumnicht announced

Hi everyone,

I also made this package a bit ago (didn't know about discuss.ocaml.org unt= il yesterday) called forc= amla (opam). = You can think of it like a very powerful spreadsheet editor. In particular,= in forcamla we equate variables instead of assign them. forc= amla also combines the power of spreadsheets with event listeners to organi= ze program execution.

A Small Example

open F=
ormula (* To use formula<=
span style=3D"color: #8f6f4a; font-style: italic;"> *)

let x =3D v 2 (*  *)
let y =3D v 2 (*  *)
let z =3D x + y
let () =3D x =3D:=
 3 (* Set x to 3, and z now is 5=
 *)

Observe there is no need to reassign z. It was equated = to x + y and will always update whenever x or y change.

Event Listeners

You can also construct event listeners using this framework. Here is a smal= l game example to illustrate this:

open F=
ormula

type hero =3D
{
  (* A bunuch of fields *)
  health: int formula
}

let player =3D
{
  (* Assign the fields *)
  health =3D v 3; (* Give health a valu=
e of something, say 3 in this case. *)
}

let game_over () =3D print_endline "Game Over!"
let () =3D when_s=
atisfied (player.health =3D? 0) game_over

Then you can do this:

let () =3D player.health =3D: !(player.health - c 1) (* N=
othing happens yet! player.health is 2 now. *)
let () =3D player=
.health =3D: !(player.health - c 1) =
(* Nothing happens yet! player health=
 is 1 now. *)
let () =3D player=
.health =3D: !(player.health - c 1) =
(* Now something happens! player.heal=
th is 0 and "Game Over!" is printed to the screen! *)

Why?

I originally designed forcamla for games but I realized it is just a useful= organizational tool in general. It is similar to Jane Street's Incremental but forcamla pri= oritizes ergonomics over efficiency.

Typegist 0.0.0

Daniel B=C3=BCnzli announced

Hello,=20

It's my pleasure to announce the first release of typegist:=20

Typegist represents the essence of OCaml types as values. This dynamic type representation can be used to devise generic type-indexed= functions =E2=80=93 value serializers, printers, parsers, differs, random = generators, editors, ffi glue, etc. Any accessible type can be described up= to the limits defined by its public interface. Typegist does not model OCaml's type language in full detail, but focuses o= n a core structural subset decorated with typed-indexed metadata to provide= an ergonomic interface for both producers and processors of the representa= tion. Typegist is distributed under the ISC license. It has no dependencies.=20

As mentioned above these values only partially model OCaml's type definitio= n language, that's the reason why they are Type.Gist.t and not= Type.Repr.t values. You should see typegist as a data interfa= cing language for your types rather than a faithful or canonical representa= tion of your types (which I find less useful in practice).

The representation special cases and annotates some of the Stdlib types: being too generic and losing all semantics in favour of generali= zed abstract non-sense is undesirable when you interface with other systems= . For example. You want list values to show up as arrays in JS= ON, not as nested cons case objects. You want None to map to <= code>null not to a constant case object. You want string values that hold textual data to show up as plain JSON strings rather tha= n hex digits or base64. Etc.

This means that part of the representation is decidedly = ad-hoc. It balances precision and genericity while making it more. A companion release of jsont was made with the new optional jsont.typegist library that <= a href=3D"https://erratique.ch/software/jsont/doc/Jsont_typegist/index.html= ">translates type gists into jsont JSON types for your JSO= N serialization pleasure (if that exists).

While I don't expect typegist to change much, it hasn't been used in anger = yet =E2=80=93 but I'll waste no time. It's again a design that has been rot= ting for too long in a repo. This means that changes in the representation = could still occur based on feedback if more precision is needed or better r= epresentation are found. However I'd expect such changes to mostly affect g= ist processors. Get in touch on the issue tracker if you run into difficult= ies or improvements.

I have no plan to propose any mean to automate gist derivations from type d= efinitions, but some people have expressed interest in doing that in the pa= st.

Happy typed-indexed programming!

This first release was made possible thanks to a grant from the OCaml Software Foundation. I also thank my donors for their support.

Best,

Daniel

— P.S. The API makes use =E2=80=93 for good =E2=80=93 of every new type gimic= k that was introduced in OCaml 5.5 :=E2=80=93)

Dependent if expressions without dependent types

Didier Wenzek announced

This post on Haskell for all shows an insighful use of Church encoding to implement dependent if express= ions without dependent types.

The following OCaml code type checks and works:

# let example bool =3D if_then_else bool 5 "hi!";;

# example t;;
 - : int =3D 5
# example f;;
=2D : string =3D "hi!"
# example (f && t);;
=2D : string =3D "hi!"
# example (f || t);;
=2D : int =3D 5
# example (not t);;
=2D : string =3D "hi!"

This is simply based on Hindley-Milner type inference, with a single trick that is to be not too restrictive on the type for Church encoded booleans.

Where the first idea to Church encode booleans would be to restrict the then and else cases to be the same (using a record to encode the forall type):

type b=
ool =3D { check : 'a. 'a -> 'a -> 'a; }

Dependent if expressions require a liberal definition:

type b=
ool =3D { check : 'a 'b 'c. 'a -> 'b -> 'c; }

And this is what is inferred when no type is enforced (ignoring the fact we get then weakly polymorphic types instead of forall t= ypes):

let t if_branch else_=
branch =3D if_branch
let f if_branch else_branch =3D else_branch

let if_then_else bo=
ol if_branch else_branch =3D bool if_branch else_branch

let (&&) a b if_branch else_branch =3D=
 a (b if_branch else_branch) else_branch
let (||) a b if_b=
ranch else_branch =3D a if_br=
anch (b if_branch else_branch)
let not a if_branch else_branch =3D a else_branch if_branch

I encourage you read the full post, this is a really nice read.

Caps 0.1.0, a capability type system and library for OCaml

Yoann Padioleau announced

Hi everyone,

I am pleased to announce the first release of the caps library, which allows you to use capability types in your OCaml programs (and libraries).

The main idea is that after you used this library, your functions can have signatures like

val foo: < Cap.network; Cap.stdout; Cap.random; .. > ->
  int -> float

meaning this function requires the network, stdout, and ra= ndom capabilities to work. The signature reveals the internal effect this function has and the kind of system calls it internally does (or its c= allees),

I designed this library while working at Semgrep on the semgrep codebase and it was useful to sandbox or control parts of the codebase so that young engineers would not call dangerous functions in certain parts. It is I think even more useful in the new coding-agent era to control in the signature the code generated by AI.

For more information you can see my talk at the OCaml 2026 workshop here: https://www.youtu= be.com/watch?v=3D4t_2wLz9EOo as well as the corresponding slides https://aryx.github.io/ocaml-caps/caps.html (using the super cool Slipshow presentation tool announced here a few times). See also the project page at https://github.com/aryx/ocaml-caps

You can easily play with it by installing it via opam:

$ opam update
$ opam install caps

Happy to answer questions.

bstr, slice and bin (bigstring, encoders and decoders for bina= ry formats)

Calascibetta Romain announced

I am delighted to announce the release of bstr.0.1.0, as well as bin.0.1.0 and slice.0.1.0. These releases are the result of a syntheti= c work between several libraries, aimed at bringing together everything tha= t might be useful to us in implementing formats and protocols within our cooperative. In particular, these librarie= s offer:

  • a comprehensive module for manipulating what are known as bigstrings (replacing bigstringaf - because the name of that librar= y is too long)
  • a library providing access to bigstrings and bytes (in short, an abstraction of ocaml-cstruct)
  • finally, a library for describing binary formats from which one can der= ive an encoder and a decoder (in the spirit of what repr can offer)

For those who want to understand the benefits of bigstrings, I=E2=80=99ve p= reviously shared my thoughts on the subject here. Alth= ough we=E2=80=99ve since backtracked on the use of ocaml-cstruct, particularly for performance reasons (see this article), bigstrings re= main useful in certain cases: they should, fundamentally, be used wisely.

Particular attention has been paid to performance using bechamel (for micro-benchmarki= ng), and we can draw a few conclusions from this:

  • bstr has the edge over bigstringaf as it uses tag= s that did not exist at the time bigstringaf was developed

      bstr bigstringaf
    blit 4.4ns 4.8ns
    sub 15.4ns 18.9ns
  • slice.bstr performs like ocaml-cstruct (which= was to be expected)
  • bin challenges hand-written code in terms of decoding

      bin hand-written (ocaml-cstruct) repr angstrom
    ipv4 11.9ns 11.9ns 93.9ns 136ns
    let bin =3D
      let fn vihl =
    tos =
    total_length id ff ttl <=
    span style=3D"color: #007a9f;">protocol checksum src dst =3D
        { version=3D vihl lsr 4; ihl=3D =
    vihl land 0x0f; tos; total_length; id
        ; flags=3D ff lsr 13; frag_offse=
    t=3D ff land 0x1fff; ttl; protocol; =
    checksum
        ; src; dst }
      in
      let open Bin in
      record ~name:"ipv4" fn
      |+ field ~name:"vih=
    l" uint8 (fun t -> (t.version lsl 4) lor t.ihl)
      |+ field ~name:"tos=
    " uint8 (fun t -> t.tos)
      |+ field ~name:"tot=
    al_length" beuint16 (fun t -> t.total_lengt=
    h)
      |+ field ~name:"id"=
     beuint16 (fun t -> t.id)
      |+ field ~name:"fla=
    gs_frag" beuint16 (t ->
          (t.flags lsl 13) lor t.frag_offset)
      |+ field ~name:"ttl=
    " uint8 (fun t -> t.ttl)
      |+ field ~name:"pro=
    tocol" uint8 (fun=
     t -> t.protocol)
      |+ field ~name:"che=
    cksum" beuint16 (=
    fun t -> t.checksum)
      |+ field ~name:"src=
    " beint32 (fun t -> t.src)
      |+ field ~name:"dst=
    " beint32 (fun t -> t.dst)
      |> sealr
    
    let cstruct cs =3D
      let vihl =3D Cstruct.get_uint8 cs 0 in
      let tos =3D Cstruct.get_uint8 cs 1 in
      let total_length =3D Cstruct.BE.get_uint16 cs 2 in
      let id =3D Cstruct.BE.get_uint16 cs 4 in
      let ff =3D Cstruct.BE.get_uint16 cs 6 in
      let ttl =3D Cstruct.get_uint8 cs 8 in
      let protocol =3D Cstruct.get_uint8 cs 9 in
      let checksum =3D Cstruct.BE.get_uint16 cs 10 in
      let src =3D Cstruct.BE.get_uint32 cs 12 in
      let dst =3D Cstruct.BE.get_uint32 cs 16 in
      { version=3D vihl lsr 4; ihl=3D vi=
    hl land 0x0f; tos; total_length; id
      ; flags=3D ff lsr 13; frag_offset=
    =3D ff land 0x1fff; ttl; protocol; c=
    hecksum
      ; src; dst }
    

These libraries were driven by the ambition to provide a coherent and consi= stent set of libraries, particularly for working with bigarrays, whilst mak= ing few compromises in terms of performance. Several attempts were made to experiment with functor= s, GADTs, ADTs and even higher-kinded polymorphism… (even with capab= ilities).

The result is that a poor man=E2=80=99s functor appears to be sufficient, along with a few tweaks (notably to avoid a= few caml_apply2 calls), to achieve something that is fairly c= ompetitive compared to hand-written code.

These libraries also encapsulate what may have been missing and/or emerged = within the community when it came to working with bigstrings. I have person= ally contributed to improving these libraries without being entirely satisf= ied with them: hence the emergence of bstr in particular. A co= nsiderable amount of effort has been put into documenting these libraries a= nd into testing them. Fuzzers are also available to verify certain assertio= ns regarding bin (such as isomorphism).

These libraries are currently in use, and this version is certainly not the= final one. Indeed, we will continue to improve them as we use them (partic= ularly with regard to the implementation of protocols and formats in OCaml).

If you appreciate our work, you can make a donation via GitHub or directly to our charity. Bighappy hacking!

OCaml 5.5.1 released

octachron announced

We have the pleasure of celebrating the birthday of Giovanni Girolamo Sacch= eri by announcing the release of OCaml version 5.5.1.

This patch-level release fixes a major type system bug for module-dependent functions and also contains two security fixes for the runtime: one in the= =20 Marshal module, another inside the loading of bytecode.

At a less severe level, this release also fixes two bugs in the runtime for concurrent programs, another runtime bug for musl users; and a handful of o= ther bugs.

The release also restores support for cloning the compiler on macOS.

Overall, we are strongly advising you to switch to OCaml 5.5.1 if you were already using OCaml 5.5.0.

The full list of bug fixes is available below for more details.

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:

opam update
opam switch create 5.5.1

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

Changes compared to OCaml 5.5.0

  • Type system
    • 14891, 14982: fix scope error= leading to an erroneous typechecking for non-dependent application of module-dependent function in presence of dependent first-class module types:

      module type T =3D sig module type=
       S end
      let f (module M:T) (m: (module M.S)) =3D m
      module type P =3D sig type 'a t en=
      d
      let error =3D
        f (module struct module type S =3D P end) (module=
       List)
      

      (Florian Angeletti, report by Hazem ElMasry, review by Gabriel Scherer)

  • Runtime
    • 14872: hard= en loading of bytecode executable files against corrupted or malicious files having 2^29 TOC entries or more. (Xavier Leroy, review by Nicol=C3=A1s Ojeda B=C3=A4r)
    • 15019: Marshal.from_{string,bytes}: guard against overflow in the computation of the total data length. (Xavier Leroy, report by Akshay Singh, review by Nicol=C3=A1s Ojeda B=C3=A4r and Antonin D=C3=A9cimo)
    • 14933: Resp= ect sysconf(_SC_SIGSTKSZ) when choosing the size for the alternate signal stack, avoiding fatal errors when linked against musl libc= on some Intel CPUs. (Nat Mote, review by Florian Angeletti and Miod Vallat)
    • 14940, fix = a memory leak in the OCaml runtime by bounding the size of the internal cache of stacks. (Vesa Karvonen, Florian Angeletti, review by Gabriel Scherer)
    • 15029: Fix = a regression on Windows where an OCaml thread that never yielded voluntarily would keep the runtime lock forever, so that the other threads of its domain never ran. Preemptive switching between systhreads had no effect; only explicit calls to Thread.yield or blocking sec= tions would let other threads run. (Nicol=C3=A1s Ojeda B=C3=A4r, report by Daniel Larraz, review by Antonin D= =C3=A9cimo)
  • Build system
    • 14883, 14884: fix Windows = cross-compilation with older mingw32-gcc versions (Brian Ward, review by Antonin D=C3=A9cimo and Stefan Muenzel)
    • 14871, 14914: Ignore OCAML= TOP_INCLUDE_PATH during the build. (David Allsopp, report by Andreas Rossberg, review by Florian Angeletti)
    • 14901, 14923: Fix the gene= rated installation script to cope with macOS's geriatric version of bash when executing in opam's sandbox. (David Allsopp, report by Julian Fondren and Sacha-=C3=89lie Ayoun, investi= gation and initial fix by Kate Deplaix, review by Florian Angeletti)
    • 14989: Impr= ove build reproducibility by letting only otherlibs/{str,unix} build their own .cmi and .cmx. The generic %.cmi/%.cmx rules of the root Makefile were racing with them under make -j and recorded a different source path, which changed the interface digest (and, through it, most other compi= led artefacts) as well as the debug info packed into str.a and unix.a. (Bernhard M. Wiedemann, review by David Allsopp and Stefan Muenzel)
  • User interface
    • 14881, 14882: fix printing= of external types that are subject to module constraints. (Stefan Muenzel, review by Florian Angeletti)
  • Runtime events library
    • 14966: add = the missing EV_MINOR_EPHE_CLEAN constructor to Runtime_events.runtime_phase, introduced in 13643. The runtime has emitted this phase since 5.4, when a minor collection has to clean locked ephemeron= s, but the OCaml type had no constructor for it, so consumers were handed an out-of-range value and crashed when matching on it. (Tim McGilchrist, review by Florian Angeletti)
    • 14969: Fix = the units of the runtime events counter EV_C_MINOR_ALLOCATED_WORDS to report as the number of words of minor heap consumed, including headers. (Tim McGilchrist, review by Nicol=C3=A1s Ojeda B=C3=A4r)

Slipshow!

Continuing this thread, Paul-Elliot announced

Another release was just merged in opam!

Did you notice the trembling glass of water? That's the next release of Sli= pshow that I'm announcing:

Slipshow 0.13.0: Juraslip Park

While digging in decades-old software, I found bugs that contained the DNA = of the now extinct Keynoplodocus, Googloslideraptor, and last but not least= , Powerpointaurus Rex.

By merging it in Slipshow's own DNA, I was able to bring back to life featu= res long forgotten by every modern software (like Slipshow): the ability to= place elements in your presentation using the mouse.

https://github.com/user-attachments/assets/2= 330aab5-ee28-4248-b215-66920cb1c7ff

The main new attraction of this release is the "GUI mode".

Until now, Slipshow placed every element for you, based on what it is (a ti= tle, a paragraph, a block) with CSS as escape hatch. This is the "What You = See Is What You Mean" model. In "What You See Is What You Get", by contrast= , you directly edit the rendered content and lay your elements out there, u= sually with the mouse.

The best of both (Jurassic) worlds would be "What You See Is What You Want"= : deciding per element which of the two modes you prefer.

Just as some frogs can change sex in a single-sex environment, a Slipshow e= lement can now turn from WYSIWYM to WYSIWYG and be placed with the mouse, w= ith a single gui attribute:

{gui}
Drag me, resize me.

Other notable improvements include Ctrl+clicking on the rendered content to= get to the source, the addition of the Ta= chyons CSS framework, more consistent shortcuts, and some quality of li= fe improvements in the drawing editor.

As usual, I thank all contributors =F0=9F=92=9A, my sponsor =E2=9D=A4=EF=B8= =8F, and NLnet for a generou= s grant =F0=9F=92=9D that made all this work possible!

Here is the full changelog:

Added

  • "What You See Is What You Want": positions any "GUI" element absolutely= , by dragging it in the preview! Supports moving, redimensioning and scaling elements. (#270)
  • "Go to source" by ~Ctrl~+clicking (or ~Cmd~+clicking on Mac) anywhere i= n the preview. (#270)
  • Added tachyons support (#278)

Changed

  • Improved toolbar and shortcut consistency, notably in recording manager= mode, Shift+R now closes the recording manager (previously it starte= d a recording). Shift+S is used to start a recording. (#270)
  • Diagnostics on slipshow compile are sorted by location (#2= 77)
  • Improve location of "Wrong Type" diagnostic (#277)
  • Hint that step counter and toc entries are clickable. (#278)
  • Pressing play in drawing editor when the cursor is at the end of the re= cording now replays from the beginning. (#278)
  • Round sub-millisecond time precision in drawing editor. (#278)

Fixed

  • LSP:
    • Respect UTF-16 position encoding when it is the only one supported by t= he editor. (#270)
    • Fix a bug in detection of element at cursor, and one in locations of "g= lued" attribute, in effect improving hover and highlight reliability. (#270)
    • Fix go_next / go_previous doing nothing in "r= efresh on save" mode. (#270)
    • Fix frontmatter error sometimes not being reported (#277)
  • Fix locations reported for frontmatter attributes:. (#271)=
  • Fix drawings being drawn behind positioned elements. (#270)
  • Fixed standalonity of html by embedding mono fonts (#272)
  • Resolution of css and js files in frontmatter are now relative to the f= ile they are in (and not to the root file). (#271)
  • LSP: correctly refresh on changes on files mentioned in frontmatter (su= ch as css and js files). (#271)
  • Improve uri vs local path detection. (#271)
  • Improve locations of errors in css: and js: f= rontmatter fields. (#271)
  • Allow spaces and tabs after frontmatter delimiters. (#275)
  • Fix drawing replay in editor stuck on a pause. (#278)
  • Fix last point of a stroke not being displayed when the recording ends = at this time. (#278)
  • Group a slide's entrance with its own heading in the table of contents = (#273)

Docs

  • Added documentation on the new GUI mode (#270)

ocp-indent 1.10.0

Nathan Rebours announced

Here at OCamlPro we're happy to announce the release of ocp-indent.1.= 10.0.

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

The main feature of this release is the support for new OCaml language feat= ures from 5.3 effect patterns to 5.5 let type or let class. All new syntax introduced in the last 3 minor compiler releases are now properly supported= .=20

It also comes with new yet long awaited features such as a --check mode which simply verifies whether the input file is correctly indented and a compleme= ntary --strict flag which makes ocp-indent warnings fat= al, both intended for CI use.

As usual there's also a bunch of bug fixes: - is now correctly= accepted as a positional argument for <stdin> input, strict_with= behaviour has been improved to be consistent across types and type extensions and starred comm= ents are now correctly indented.

We'd like to thank Ahrefs who's funded this release through their grant program!

May your .ml files be properly indented :pray:

Intel ISA specification interpreter/compiler is written in OC= aml

Edwin T=C3=B6r=C3=B6k announced

Intel has recently published a beta executable specification for its ISA: <= a href=3D"https://intel.github.io/SDM/announcement/2026/08/20/announce-prev= iew.html">https://intel.github.io/SDM/announcement/2026/08/20/announce-prev= iew.html . Although approximations for an ISA specification have existe= d before (e.g. in ACL2 or SAIL), they were constructed based on the manual in prose= form (which had bugs in the= past). Having the specification published in an executable language (a= nd hopefully tested!) by the vendor itself is a welcome improvement.

Even better, I just noticed that the interpreter/compiler for the specification language is wri= tten in OCaml!

TyXML 5.0.0

Vincent Balat announced

We are happy to announce TyXML 5.0.0, a major release. TyXML builds = HTML and SVG documents whose validity is checked by the OCaml type system: = an element the specification does not allow in a given position does not ty= pecheck. The library now follows the current specifications, the WHATWG liv= ing standard for HTML and SVG 2 with the Filter Effects module, where SVG s= upport had not moved since SVG 1.1.

Highlights:

  • HTML: popover, invoker commands, microdata, declarative shadow D= OM and CSS shadow parts, loading~/~decoding~/~fetchpriority, <= code>blocking, the new elements s, bdi, search, data, slot and track, the event handler attributes that were missing (the pointer family, cl= ipboard, ontoggle, onscrollend and friends), and = content models brought in line with the standard.
  • SVG: mask was declared in Svg_types bu= t the element itself was missing, feMerge could be given no ch= ild because feMergeNode did not exist, and about thirty presen= tation attributes had a type tag but no function to produce them. All of th= ose are in, together with the SVG 2 additions, ARIA support, the SVG 2 link= attributes, and content models widened to SVG 2.
  • The PPX and JSX syntaxes: no camel case SVG attribute was recogn= ised, so viewBox, stdDeviation, preserveAsp= ectRatio and most others were rejected, which means most real SVG co= uld not be written with the PPX at all. Whitespace between SVG tags is also= ignored now where the content model does not accept text, so indented SVG = typechecks.
  • Constructs that no program could actually use are fixed: a= rea had no href and its tag was in no content model, so= a map containing areas fitted nowhere; symbol ac= cepted no core attributes, hence no id and no way to reference= it; the li children of menu could not be built. = Several attribute names were also emitted misspelled, which is worse than a= compile error since the output looks fine. Breaking changes worth knowing = about: hidden and contenteditable take an enumera= ted argument, the URL-valued attributes go through Xml.uri, SV= G documents are printed without the SVG 1.1 doctype, Wrapped_function= s has four new functions for implementers of the functorial interfac= e, and the build requires OCaml 4.08, dune 3.18 and ppxlib 0.36.
opam install tyxml

Thanks to everyone who contributed to this release, in particular Hugo Heuz= ard, Martin Bodin, toastal, Sylvain Boilard, rand00, Sora Morimoto, Patrick= Ferris and Gabriel Radanne. Bug reports and pull requests are welcome on <= a href=3D"https://github.com/ocsigen/tyxml">https://github.com/ocsigen/tyxm= l.

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.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmqgC7UbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5cfbAwgAouIP0uvaXO3oaoRrRX/OtJfYxQRux8sXxyXk+oma BFtmz90np6d/rm6OFwL/9DuA0B/AyYzzBQExu+rX2R+zOvhGR/wtTbvZ5UGKehPX XK6kBhAxvtWG911UBZzyPtiKSjZ2dWK43BHflf7Kn0H33VZ3LJFkOAG7ABfAG3c6 tmXU/HodSZZNhbm3tgGovQtbDVwNM9CG8b7Sj0ryM1JoMM1jNro0C4W3M90wSVDW oJE1lkiePt7WcMlg21A0hu0M7yHYDwdvJ2Z9bk4OttlSRRv+M2goxL0jK2kcCwJY nKjVjTg8to+QFce9HjWZkZc8M6c//H1O0PuYr9Gmp3ZSTw== =EeYg -----END PGP SIGNATURE----- --===-=-=--