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=h1Tvtc7s; 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=daLpJwau; 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 77902400A0 for ; Tue, 14 Oct 2025 09:56:54 +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=H6qAaKcuSjgLLw46pJpC7R2yZhk2Zfr3fcrMEbWvVBU=; b=h1Tvtc7shJJ/h5hUTvAttsHQeveOrjAPviIqAuEb6FTq1WJmHQuXfUcR rvJOhYEAVl9+UD9UQo+xpYv74iDP6ONvzUwqihe/d3hpO7P6+u3aWU/MW oUExJPXlb2NdLBsciyGpqHLvekRnzv4GumpUrlfusC89K0RubOAU1R+yF o=; X-CSE-ConnectionGUID: iF7NNiSZTJie5M04q1f2lw== X-CSE-MsgGUID: 54QCtHOnQH2qMeGuGIr1BA== 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.19,227,1754949600"; d="scan'208,217";a="244122920" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Oct 2025 11:56:54 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 08BBAE0C55; Tue, 14 Oct 2025 11:56:54 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 525BDE0172 for ; Tue, 14 Oct 2025 11:56:47 +0200 (CEST) X-CSE-ConnectionGUID: rJna6FlhQNSOFG/fYS55tA== X-CSE-MsgGUID: edpEgpVgS86j2/cI2JR33g== IronPort-SDR: 68ee1e5d_VruE5603nIhNoNXaZmUNYJ6yWJZFpmkKWitJBWjRnV0Vn6F vOSGwh39h9ByveJJPYcbMBRD1d6mF93MHJZ5D+g== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GrAwAxHe5ogSIeaIFaHgESCwEMg01bKBkBaF4zBwhJB?= =?us-ascii?q?E6EA4NPhTWIb5FNiEuCMIFpgSwWIxUBAwENLgEbBAECBAEBAwECAYUAAoxMA?= =?us-ascii?q?h8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQAQE9B?= =?us-ascii?q?UmGTw2CRRk4cWUJNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQIEBAQBAgUKARV3AQgEBhMBATgYIwMUAQYDAhEBNQMBEwESF?= =?us-ascii?q?AaCEFmCIAICTwMFDAaSJJp7Gjd6fzOBAYIMAQEGUjY+AwIJAgIDDy4B2gyBZ?= =?us-ascii?q?AmBSoVtgkoaASpJURoChEcJhDQnD4FVRIFKgVYdSgdvgj8LFwEBAQEBgRUCD?= =?us-ascii?q?AUBEQIBKSQJGIMNgmmCERVTJxQdElmFLIInAwYEQoEzjAqBREszLAFVExcLB?= =?us-ascii?q?wVbgQgDKjQtbjIdgSdDHnOBFINJDxJoDwaBE4NUiWoPhGsDC209NxQbkjlCG?= =?us-ascii?q?RgVgVMvDgoBMwIsECMUBw4FAQcMCAgEAgEBBRsCLggFCR0HAgQBCgUTAQ4NA?= =?us-ascii?q?QoFBQQEARYvCQICCQEBLQOSQxsdBCoDj1mDVopCCJRbNAeEH4FeBgyJCIEml?= =?us-ascii?q?gaEBIFXizyHApJSIpgmPiKCNoYngQAKgRcFCYFva4UjkDMKCB6FM4FSLSNsP?= =?us-ascii?q?x4MBzMaMEOCMwEBMglGHA9Yjn0BCYJCb0+BDBqBIwRFCDu3UkE1AgEBBzECB?= =?us-ascii?q?wEKAQEDCYViAQGMBgICDRcHBWtgAQE?= IronPort-PHdr: A9a23:tcxnwhyiDSoHurDXCzLkxFBlVkEcU1XcAAcZ59Idhq5Udez7ptK+Z xeZvakm1QWRB9yTq6odzbaN6Oa4Ai1IyK3CmU5BWaQEbwUCh8QSkl5oK+++Imq/AdjUKgcXJ 4B8bmJj5GyxKkNPGczzNBX4q3y26iMOSF2kbVImbuv6FZTPgMupyuu854PcYxlShDq6fLh+M Ai6oR/eu8QYj4ZuMLo9xxTGrndVZeha2X1kKU+OlBr4+su84YRv/itetv8v7cJMTav3c6ElR rFEEToqNHw468LsuRTfVwWE+2ESUn8RkhpGAgjF6A/1U5LsuSbkteRzxTeXM9TuQb47QTqt4 L5nRQHnhikaLzI2/33ZhcJ2jKJAvRKuvAd/zJLOYIGUL/VxYKXQds4HSGVbX8ZRUytBAp6gb 4YKEuEMM/pUo5X7qlATrRewBg+sBP3uyj9Th3/5xqk63Po8GgDI2wwgBc8BsG/Jp9nxOqoeT eW5wa/VxjvBcvxWwy/w5ojWfB48r/+CXr1/ftbKxEY1Cw/IlE+dpZD5Mz6X0OkGrmiV7/BnV eKqk2MqtwVxrSKpxswxl4fGmoIVylXF9SVl3IY+ONq1R1R/YdG+FptcrTqaOJd2QsMnQmFop Do6x6YeuZ68eCgLyIgnyADDZPyHdYiI4wvjVPuPLjtig3JlYr2/ig+0/EO9xeLyStO630xWr ipZjNbMrHYN2gTN58WaV/Zw8Vut1SuM2g3T5exJPUA5m6TGJ5MjzLM+lpUevFrNEyL0lkv4g 66be0c59uW26+rpbavrqoGSOoNqjAz1L6ogmsu6AesiMwgOWXCW+fyi273//E35XKtFjuUxk qnctZDVO94XpqinDA9Jyooj7AqwAC2j0NQch3UHK0hFeB2fg4jmOlHOPPD4DeqkjFi2jDhrw PXGMqXvApXQKHjPibDhcqpn5E5ZzAo/18xQ55VRCr0ZJPL8REDwtN3WDh84KQC73+HnCNBl2 oMZRW2AGKqZMKfKsV+S4eIjOfWDZIgQuDrlN/cq+eThgWU3mV8HZaWp04EXZ2q9Hvt8OkmWf WDgjcsGEWcPpgY+SfbliF6cXj5IeXmyW6w86is6CIKhFYvCSIGtgbOd3Ce8GZ1WYntGBU6QE XvycIWEQfgMZDqOLc9niDwETqKtS4E71R22ug/60aRoIfTO9i0Wr5LvzMJ16PPJmh4v8Dx7E d6R02SQQG1smWMHWyU53KV7oUBn0FuD1rJ4g/NAGdxP/fxJSAY6OoPCwOxhEdz9RgXBftKRR Fa6X9WmByo+Ts8rw94OeUp9HM+ijh/b0yqrBb8Vjb2LC4Yu/qLSxXj8Idt2xXXe1KQ5klUqX M9COXe7iqJj+AXfHYDEn1mDm6ukeqkQxDPB+WmewWaUok1VUAF9Xb/bUXwCfEfas9v060fEQ rSzE7ooKBFBxtSHKqZSat3mk1FGRPD7NdTbbGO9hn28BQ6PxrOIbIvqZ3sS0zndCEgCkgAT5 GuGOhYkCiemuWLeAyRiFVPpY0zy7elzsG63QlEwwg2QckFty7W49gQbiPCAUf8e0L0JtD8kq zpuHVa929zWC8CHpwpkZKhSfM8z7kpb2W/BtwNwP5+vL7h6i1MRcgt6p1vu1xJzCoRAjcgls m8lzAp0KaKZyVNBai2X0Yr3Or3NJWn/5Aqga6rM1VHYytqW4bsA6PQ9q1XioAGpClEv/G5g0 9lI1XuT+ovFDBEIXZL0XUs2+AJ2p7bAYiky/4/Uz2FjMbGosj/e3NIkHPcqxQylf9dbKa+EE A7yE9YGB8W1M+wrm12pbgoeM+xI9a40Odmmd/qc16KxMuZghiqqjWJc749lyEKD6zJ8SvLU3 5YC2/yUwxOLVzjig1emsc75g5hJazEOEGan0yjrGpBRaK5oc4sTDGevLNC7ys9mh57qX35Z9 EKjCE0a18+pfxqSbkX93RBO2kgNpnyngyS4wyRpnDEqr6qf2TTDzfztehUJJGBFWHVvg1H0L YepitAVRlKoYBQxmRW9/Ej036dVqLxkL2nLT0dFZzL4In1/XKWtrraCeNZP6J0wviVXTuu8Z VeaR6bnrRYGzi3tAjgW+DduPTW1vN+xyxhljkqZM3A1qnfFL4U4zh7a4JnYROVN9jsAXihxz zfNVXamONz81NGdkd/4ueC7Vn69HsladSDti5iLtC66+XFCGRq7juy+kd3hEBEn3Gn8zdY8B naAlwr1foS+j/fyCulgZEQ9XweUA6tSH4h/ltB1n5QMwT0BgY3T+3MbkGD1ONEd2KTkbXNLS yRYi8XN7l3D30tuZmmM25q/Tm+Ul8Jlbt/8eWgW3yMh8+hSD6OF8LFPnS10u0e16wXLbqs1h S8TnMMn82VSmOQVoEwoxySZDKoVGBxjBxe0wivW3cjr8JUCfGGrYKS930p4nMm8AfeFuA4JU XLwfNE5Fi9179ljGFjLzXv455qifYXAK9UJuU7ciA/O2tBcM4l5jf8WnWxnNGb66GUi0PI+h Ady0IuSuZjebX1q+LOlDxVYMDzses5V/Svi5UpHtuCR2Y3nXpBoGzFQGYDtUertCzUK8/LuK weJFjQ47HadA7vWWwGFug9gqDrUHpanOmvyRjFRxMh+RBSbOE1UgRwFFDQ8kJkjEwm2xcvnO E5n7zEV71T8p1NC0OVtfxX4V27eok+vZFJWANCWKBNQqBpJ50LULdC29uV3Dj1V9Z2nrRWQJ yqcfQsJRWAFV0qYBkzya6G07IqlkaDQDe6/Iv3SJLSW/LUEBrHRnc7pidMgpGrfU6fHdmNvB PA6xEdZCHVwGsCC3i4KVzRSjCXVKciSuBa7/CRz6MG56vXiHgz1tu7tQ/NfN8ti/xeujOKNL emV0WxCEw0Ag6xS92edlIhKxFkWmj1jfDmrEK0duGjKVq2Fk6teCVgAYCN2NddUx6g7ww9GN NWdj4/lkLligbRmbjUNHUykgcyvacEQdiu0MFrBQl2ANLGHOSHj28bzcL+xQr1WjfxJulu3o znRQCqBdnyT0jLuUR6oK+RFiiqWaQdftI+KeRFoEWH/TdjiZ3VXKfdPhCYtif0xj3LObisHN CRkNlhKtvuW5D9ZhfN2HypA6GBkJK+KgXTR4+7dI5cQ+fxlZ0Y839lg2yxv9OVn9HQYdKltn y/DstNlo1eni/SCjD19X09Hrj9NwpmAvUBjJbnx/J5dX33J51QIsXXWDA4FwrktQtHioKFfz NHTmbm7cW0TtYuMoY1HX46PdIqOKzI5PADsGSLIAQdNVjOtOWzFxik/2LmT+nCTspkmu83pk ZsKRKVcUQ99HfcbB0J5Wd0adc4tD3V9yeLd15ZOvibtyXuZDN9XtZ3GSP+IVPDmKTLCyKJBe wNN2rTga4IaKoz83UVmLFh8hoXDXUTKDrUv6mVsaBE5pEJV/T1wVGo2jgjeUDj1tUBNJ+bhw i5jkgx6cPgg/zfq4k4qKxzNviRlmU04n5P+ijCUcSLtBK23QIddBjGyshQhdJThTEwmCG/61 VwhLzrCS79L2vFbT1sz3TCCi4MaRc4JVapAcQMdzvGRZuw13BJbsCryzEtO463eAptnlRc2W ZSrsnRL1hklaYIlY6vKK+AaqzoYzrLLtSiu2OcrxQYYLEtY62KedhkDv0kQP6UnLS6lraR8r BaPkDxZdC0QRuIn97h0o1glNb3KnEeCm/ZTb1q8POuFI+aFtnjcwISWF0go2BpA1Ehdoeovi 5ZlKhLIERt3iuDNX1cILZaQcFsEKZMKqD6IJWDV7ICvido2Pp3hRLGxC7bU7eBK2AT9RFlhX IUUsJZbRsH1gh2BIZ+1JexawBhwtla1KArVXq8SHXDD2HQGu5/tlscvhNsBfz1FUzwvYHm76 +SF+VR0jKjcAIhuKjITWo9OXp4vcPWzgDUR/3FJDT3sl/kc1BDH9Djk4CLZEDj7adNnIvaSf xJlTt+sq30z9K2/iFif9Zu7RSmyLdN5ptrG8v8Xvb6CG6oSVb55olvRkIleRmW3XijIC9H9K 5XraoYqZMD5ET7jCA350mppCZypeo3xZqGT5GOgDZ5ZqoyawCwuOYemGzcSFg0x7+AP6aRgZ BESNpo2ZRm7/w86NqG5PEKZyoD3GTfrcGMKCaIHi77mNNk1h2I2Y+S3yWUtVMQ/xuizqgsWQ Y0SywrZ3bClbpVfVi76HjpcfR/OrGw3jTsEVK56z+EhzRfPqVRZPSqMcbkjU1Z/54QDW2GKd ClGX3I/Q06AgIHD5A+1wr1U+DFSyt9Q2OsDq3P+u57DfBqmX7GtopjO9S98fZ4huaI7YumBa oOW8YjTmDDSVsyaqgqeTCuzDOZXgPBVMHseWP5MiH0oMswAuJNc5Aw2TMh0dNktQOE847utb zRjFysbyyQUApiB0DI1ieC5w7LGlx2UfcdqIFkevZ5FmNdYTz9ub3ZUuvq4T4uP3TzhKCBDM EIJ4A9L/g5FioJgYrWv/t/TVJEVgzce5vtwVmGj/nhA8kuiDHmRhUnkRf6hle2wwA8Uy+jjg IBzsPFXA09Awe1bjQ0tdKExLLMf7NeiWtqgbUT+rX7gw+ugJUBMxIvTbVKqVOL4 IronPort-Data: A9a23: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 4QqbTgsfXxXgnId3Sqtl7C51f3ZUP7SI+0UUBqy IronPort-HdrOrdr: A9a23:SqBVKqgqeoljPo4DC1Pfl74TB3BQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3AJWZSLWnur3p9LzFXxqjnUB62wtXXOWf/yn6ODUu?= =?us-ascii?q?4MEBSb5O6DlGhw/45j+M7zg=3D=3D?= X-Talos-MUID: 9a23:itYzQwoMDvFGlIuFqeUezzxuLOpn+5qhMxBTk89BsOjeFxYrYDjI2Q== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,227,1754949600"; d="scan'208,217";a="128146267" X-MGA-submission: =?us-ascii?q?MDGCIz0kP0qd671h4r+DeBHJW5oc/6E3a3oywH?= =?us-ascii?q?V5WmFGnJOSGbMsXOC4s2YvA8Athlx7gbuqBUwzXVhcFGEDIZCxnqwyHh?= =?us-ascii?q?RtAFf7q+DOK3lxSIGvC7PUDD00DCA7bGL+20BvUqAVeN4/ApCO59m+Aq?= =?us-ascii?q?gcp7jecd9MVUtB9HhS8uoi8A=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; 14 Oct 2025 11:56:45 +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 D0BE31A335; Tue, 14 Oct 2025 11:56:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1760435804; bh=HkyN7k4CdyjjEdCt//HX9X3TRpopc31mjKDwb4uPKJw=; h=From:To:Subject:Date:Message-ID; b=daLpJwau73AexCWyaOB9AELxi+Y6y/PY8qfZpc9QP66C52UZ/K2ryJ4rGDdssH8Eu VDbpRJA5Wwc7dOvHG7EECEnZqI+tUK9OM2te6xn7aRGPO+3s+aW8G53lFD3kcfO04q whRLyEW8raX8Zi/I8h7SFLmtmkcvid6vnjhc8j2U= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 14 Oct 2025 11:56:44 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 14 11:56:45 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499389, queueID=007C51A545 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: 19388 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 October 07 to 14, 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 opam-publish 2.7.0 OCaml.org: Introducing Backstage OCaml - Separate Feeds for Stable and Expe= rimental Features LexiFi at FUN OCaml 2025 Introducing `oui' OCaml 5.4.0 released OCaml compiler office hours tutorial about compiling ocaml-5 on a ChromBook with Crostini dune-release-action: Automate your opam package releases with GitHub Actions Other OCaml News Old CWN opam-publish 2.7.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 Archive: Kate 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 Hi everyone, We are happy to announce the release of opam-publish 2.7.0 (and 2.6.0), which together brought the ability to more easily publish your releases automatically, thanks to @filipeom: =E2=80=A2 A new `OPAM_PUBLISH_GH_TOKEN' environment variable and `--token' argument are now available to pass the GitHub token =E2=80=A2 SSH keys aren't used to push the branch to the user's fork anymore. Instead the token we already require is used. =E2=80=A2 If undefined, the git config variables `user.name' and `user.em= ail' are automatically filled with the github username and username@opam-publish as a backup An example of the new automated setup can be found in [this CI job]. Other minor changes include: =E2=80=A2 The addition of a message after the PR is open, to notify users= that they can re-run opam-publish to update the PR. *Thanks to @punchagan* =E2=80=A2 The switch from `lwt_ssl' to `tls-lwt' which avoid one dependen= cy and avoid depending on the system libssl Happy publishing! <> <> The opam team <> <> :camel: [this CI job] OCaml.org: Introducing Backstage OCaml - Separate Feeds for Stable and Expe= rimental Features =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=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: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're pleased to announce that OCaml.org now has dedicated RSS feeds and pages for stable and experimental announcements, introduced in [PR #3278]! *What's new:* =E2=80=A2 *OCaml Changelog* at [ocaml.org/changelog] =E2=80=94 Official s= table release announcements and updates from the OCaml compiler, OCaml infrastructure, and the OCaml Platform Tools =E2=80=A2 *Backstage OCaml* at [ocaml.org/backstage] =E2=80=94 Updates on= experimental releases, work-in-progress, and opportunities to contribute to the development of the OCaml Platform and its infrastructure This separation helps keep the main changelog focused on production-ready releases while providing a dedicated space for those interested in experimental work, early testing, and contributing to OCaml's development. Both pages have their own RSS feeds, so you can subscribe to whichever matches your needs=E2=80=94or both! We welcome your feedback as we continue improving OCaml.org. [PR #3278] [ocaml.org/changelog] [ocaml.org/backstage] LexiFi at FUN OCaml 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: Nicolas Ojeda Bar 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 Dear OCaml enthusiasts, LexiFi participated in this year's [FUN OCaml] that took place in Warsaw this past September 15 and 16. The event was a great success, thanks to the efforts of the organizers and the other participants. Hopefully the event will continue to take place and develop in the future. LexiFi both sponsored and contributed (two) presentations to the event: a 30-minute retrospective on 25 years of using OCaml at LexiFi, and a 2-hour workshop on implementing a toy version of our type-reflection extension to the compiler. If you are interested, we wrote a short blog post where you will find the slides and the video for the 30-minute presentation, as well as the code and the slides for the 2-hour workshop (the video recording for this part is not yet available). Enjoy! Best wishes, Nicolas [FUN OCaml] Introducing `oui' =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=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 At [OCamlPro] we're happy to announce our new ongoing project funded by the [CEA-List]: ocaml-universal-installer or `oui'! `oui''s goal is to help teams developping applications in OCaml to package them for their users outside the OCaml World by building binary installers for all major platforms: Linux, Windows and macOS. `oui' builds standalone installers: you just need to download and run the file. No need to install OCaml, Opam and to compile anything on the target system anymore. The tool will be used to package and distribute [Frama-C] and its plugins to non opam users. It is still in development but we'd like to present it to the community with the hope that it will prove helpful to you as well. [OCamlPro] [CEA-List] [Frama-C] How it works =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=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 take care of building your application and provide `oui' the list of your binaries and extra files you'd like installed alongside them and it will assemble an installer from those. It uses different tools and build different types of installers for all three main platfoms: =E2=80=A2 on Linux, we build self extracting archives using [makeself]. =E2=80=A2 on Windows, we build MSI using the [Wix6 toolset] =E2=80=A2 on macOS, we build regular OSX installers using `pkgbuild~/~productbuild' We started `oui' on top of an older but very similar project: `opam-wix'. `opam-wix' was an opam plugin used to build a Windows MSI from a locally installed opam package. This feature, though not the core focus of the early development, is still available via `opam-oui' and will be extended with the ability to build installers for the other supported platforms. [makeself] [Wix6 toolset] A tool for the community =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Though it is initially developped for Frama-C's distribution, both the CEA-List and ourselves at OCamlPro would like to make `oui' a community tool that can help open source OCaml developpers ship their applications easily. The goal of this early announcement is to gather data and feedback on other use cases for binary installers across the OCaml Ecosystem to help us shape `oui' into the right tool from the start. This is an ongoing project, if you'd like to follow the development, it is publicly hosted [here]. [here] OCaml 5.4.0 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 birthdays of Camille Saint-Sa=C3=ABns and Karl Schwarzschild by announcing the release of OCaml version 5.4.0. Some of the highlights of OCaml 5.4.0 are: Labelled tuples =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C It is now possible to add labels on tuple fields =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let ( * ) (x,~dx) (y, ~dy) =3D =E2=94=82 x*.y, ~dx:(x *. dy +. y *. dx ) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Those labeled tuples are equivalent to SML records: they are an ordered and structurally-typed variants of records. In particular this implies that partial pattern matching on tuples is only possible for labelled tuples with a known type: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type t =3D float * dx:float =E2=94=82 let v (x_and_dx:t) =3D let (x,..) =3D x_and_dx in x =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Those types are mostly intended for local types where previous code was using tuples. Array literal syntax support for immutable arrays and ~floatarray~s =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=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 array literal syntax is now shared by array-like primitive types, like `'a array', `floatarray' and immutable array `iarray'. For instance, this code =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let x =3D Float.Array.of_list [0.;1.;2.] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 can now be written =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let x : floatarray =3D [|0.; 1.; 2.|] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This also supported in patterns =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let one =3D match x with =E2=94=82 | [|_;y;_|] -> Some y =E2=94=82 | _ -> None =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 However array indexing still needs to go through user-defined indexing operators =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let (.$()) =3D Float.Array.get =E2=94=82 let (.$()<-) =3D Float.Array.set =E2=94=82 let () =3D x.$(0) <- x.$(1) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Immutable arrays =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Along with shared array literals, OCaml 5.4 adds support for immutable arrays. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let v: int iarray =3D [| 0; 1; 2 |] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Immutable arrays are covariant in the type of their elements, it is thus possible to coerce immutable arrays with no costs at runtime: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let i1: _ iarray =3D [|object method m =3D 0 end|] =E2=94=82 let i2 =3D ( i1 :> < > iarray) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Atomic record fields =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C It is now possible to mark a field of a record as atomic. Atomic operations on those fields require to use the new `Atomic.Loc' submodule after accessing the location with the `[%atomic.loc ...]' builtin extension. For instance, =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a mpsc_list =3D { mutable head:'a list; mutable tail: 'a = list [@atomic] } =E2=94=82=20 =E2=94=82 let rec push t x =3D =E2=94=82 let before =3D Atomic.Loc.get [%atomic.loc t.tail] in =E2=94=82 let after =3D x :: before in =E2=94=82 if not (Atomic.Loc.compare_and_set [%atomic.loc t.tail] befor= e after) then =E2=94=82 push t x =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Moreover, it is forbidden to pattern match on atomic fields: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f { head; tail } =3D tail =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 Error: Atomic fields (here tail) are forbidden in patterns, =E2=94=82 as it is difficult to reason about when the atomic read =E2=94=82 will happen during pattern matching: the field may be re= ad =E2=94=82 zero, one or several times depending on the patterns aro= und it. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 in order to make all reads on those atomic fields explicit. Four new standard library modules: Pair, Pqueue, Repr, and Iarray =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=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 standard library has been extended with four new modules: =E2=80=A2 Pair: functions for working on pairs =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let ones =3D Pair.map_fst succ (0,1) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Pqueue: priority queues, generic or not =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module Int_pqueue =3D Pqueue.MakeMin(Int) =E2=94=82 let q =3D Int_pqueue.of_list [4;0;5;7] =E2=94=82 let some_zero =3D Int_pqueue.pop_min q =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Repr: physical and structural equality, comparison function, mo= re generically all functions dependent on the memory representation of values. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f =3D Repr.phys_equal (ref 0) (ref 0) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Iarray: functions on immutable arrays =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let a =3D Iarray.init 10 Fun.id =E2=94=82 let b =3D Iarray.map succ a =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Restored "memory cleanup upon exit" mode =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This mode allows to restart many time the OCaml runtime in C-driven programs that interact with OCaml libraries. It is also useful to reduce noise when tracking memory leaks in C code running the OCaml runtime. To get around cancellation issues, the restored mode currently assumes that all domains are joined before exiting the OCaml runtime. A new section in the reference manual on profiling OCaml programs on Linux = and macOS =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=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 new section in the [reference manual] explains how to use OS specific profiling tools to profile native OCaml programs. [reference manual] A lot of incremental changes: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=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 Many runtime and code generation improvements =E2=80=A2 More than thirty new standard library functions =E2=80=A2 Nearly a dozen improved error messages =E2=80=A2 Around fifty bug fixes Please report any unexpected behaviours on the [OCaml issue tracker] and post any questions or comments you might have on our [discussion forums]. The full list of changes can be found in the full changelog. /Editor note: please follow the archive link above for the installation instructions and the full changelog/ Happy hacking, Florian Angeletti for the OCaml team. [OCaml issue tracker] [discussion forums] OCaml compiler office hours =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Continuing this thread, gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The meeting went well =E2=80=93 see the [collaborative pad] for notes. I propose to have another meeting about a month from now: on *November 7th* at *15:30=E2=80=9317:00* UTC (I picked a different time slot from the current one, that also looks reasonable given previous poll results. If extra people would like to join, please feel free to participate to the time-slot poll in [the first post] so that I can tell when are good meeting times.) @giltho thanks for noticing the language issue on the online-meeting service I proposed; this is a new issue that looks like it comes from a version upgrade, it of course had a fine English interface when I adopted the service. Let's keep jitsi.meet for now. [collaborative pad] [the first post] tutorial about compiling ocaml-5 on a ChromBook with Crostini =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=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 Hello dear list, I wrote another mini-tutorial to explain how to compile ocaml-5 on a chromebook with crostini: [http://decapode314.free.fr/ocaml2/tut/tut-ocaml-5/tut-ocaml-5.html] The trick to compile ocaml-5 in this environement was the same than to compile ocaml-4 in the same environement because `ln -s' doesn't seem to produce the expected result. At the beginning I edited the `Makefile' to replace the `ln -s' commands by `cp' commands, but an easier way is to use the `make' feature that permits you to change the value of one of the variable from the command line which invokes `make', like this `make LN=3Dcp'. With this trick everything was producing the expected `ocaml' `tools' with ocaml-4, but with ocaml-5, I have only been able to get `ocamlnat' and `ocamlopt' tools (which is enough.) `ocamlopt' was installed as expected by the `make install' command, but `ocamlnat' had to be copied by hand. If the command `ocaml' produces an error (`cannot execute'), in scripts I can still replace: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #!/usr/bin/env ocaml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 by: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #!/usr/bin/env ocamlnat =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 By defining the same environement variables than `opam' I can get two different ocaml version usable at the same time, one 4 version, and a 5 version, next to each other at the same time, without using `opam' because `opam' grew up a lot, and in crostini environement we quickly lack of space. PS: If someone want to help finding how to get the `ocaml' and `ocamlc' commands functioning, the help will be wellcome, and I will update this mini-tutorial. [http://decapode314.free.fr/ocaml2/tut/tut-ocaml-5/tut-ocaml-5.html] dune-release-action: Automate your opam package releases with GitHub Actions =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=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: David Sancho 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 Hi everyone =F0=9F=91=8B I'm excited to share a new GitHub Action I've been working on: *dune-release-action* If you maintain OCaml packages, you know the drill: every release involves a ritual of commands and manual steps. You need to: 1. Ensure your CHANGES.md is properly formatted 2. Tag your release 3. Run `dune-release' `lint + distrib + submit' 4. Create a GitHub release with the correct changelog section 5. Check the opam-repository's PR 6. Oh shit, github token is expired 7. Create new token without expiration (??) 8. Retry For me, was following this guide by @anmonteiro, but it typically took around an hour per release. dune-release-action =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C `dune-release-action' automates the entire release workflow in GitHub Actions. Push a git tag, and the action runs dune-release for you with: =E2=80=A2 Handles all the `dune-release' orchestration =E2=80=A2 Validates your changelog format (right tag exists, etc) =E2=80=A2 Creates a GitHub release with proper description (from your changelog section (!!)) =E2=80=A2 Submits a PR to opam-repository =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 name: Release =E2=94=82=20 =E2=94=82 on: =E2=94=82 push: =E2=94=82 tags: =E2=94=82 - '*' =E2=94=82=20 =E2=94=82 permissions: =E2=94=82 contents: write =E2=94=82 pull-requests: write =E2=94=82=20 =E2=94=82 jobs: =E2=94=82 release: =E2=94=82 runs-on: ubuntu-latest =E2=94=82 steps: =E2=94=82 - uses: actions/checkout@v4 =E2=94=82 with: =E2=94=82 fetch-depth: 0 =E2=94=82=20 =E2=94=82 - uses: ocaml/setup-ocaml@v3 =E2=94=82 with: =E2=94=82 ocaml-compiler: 5.3.0 =E2=94=82=20 =E2=94=82 - run: opam install dune-release -y =E2=94=82=20 =E2=94=82 - uses: davesnx/dune-release-action@v1 =E2=94=82 with: =E2=94=82 package-name: 'your-package' =E2=94=82 github-token: ${{ secrets.GH_TOKEN }} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is very much a one-day half vibe-coded project and it's hard to test in many use cases, I'm sure there are edge cases and workflows I haven't considered. =E2=80=A2 *Repository*: =E2=80=A2 *Documentation*: Looking forward to hearing your thoughts! 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 [OCaml 5.4 Release: New Features, Fixes, and More!] =E2=80=A2 [Docker base image build rate] =E2=80=A2 [LexiFi at FUN OCaml 2025] =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [Updating OCaml CI systems to FreeBSD 14.3] [the ocaml.org blog] [OCaml 5.4 Release: New Features, Fixes, and More!] [Docker base image build rate] [LexiFi at FUN OCaml 2025] [Upcoming OCaml Events] [Updating OCaml CI systems to FreeBSD 14.3] 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 October 07 to 14, 202= 5.

opam-publish 2.7.0

Kate announced

Hi everyone,

We are happy to announce the release of opam-publish 2.7.0 (and 2.6.0), whi= ch together brought the ability to more easily publish your releases automa= tically, thanks to @filipeom:

  • A new OPAM_PUBLISH_GH_TOKEN environment variable and --token argument are now available to pass the GitHub token
  • SSH keys aren't used to push the branch to the user's fork anymore. Ins= tead the token we already require is used.
  • If undefined, the git config variables user.name and user.email are automatically filled with the github username and us= ername@opam-publish as a backup

An example of the new automated setup can be found in t= his CI job.

Other minor changes include:

  • The addition of a message after the PR is open, to notify users that th= ey can re-run opam-publish to update the PR. Thanks to @punchagan
  • The switch from lwt_ssl to tls-lwt which avoi= d one dependency and avoid depending on the system libssl

Happy publishing!

<> <> The opam team <> <> :camel:

OCaml.org: Introducing Backstage OCaml - Separate Feeds for St= able and Experimental Features

Sabine Schmaltz announced

We're pleased to announce that OCaml.org now has dedicated RSS feeds and pa= ges for stable and experimental announcements, introduced in PR #3278!

What's new:

  • OCaml Changelog at ocaml= .org/changelog =E2=80=94 Official stable release announcements and upda= tes from the OCaml compiler, OCaml infrastructure, and the OCaml Platform T= ools
  • Backstage OCaml at ocaml= .org/backstage =E2=80=94 Updates on experimental releases, work-in-prog= ress, and opportunities to contribute to the development of the OCaml Platf= orm and its infrastructure

This separation helps keep the main changelog focused on production-ready r= eleases while providing a dedicated space for those interested in experimen= tal work, early testing, and contributing to OCaml's development.

Both pages have their own RSS feeds, so you can subscribe to whichever matc= hes your needs=E2=80=94or both!

We welcome your feedback as we continue improving OCaml.org.

LexiFi at FUN OCaml 2025

Nicolas Ojeda Bar announced

Dear OCaml enthusiasts,

LexiFi participated in this year's FUN OC= aml that took place in Warsaw this past September 15 and 16. The event = was a great success, thanks to the efforts of the organizers and the other = participants. Hopefully the event will continue to take place and develop i= n the future.

LexiFi both sponsored and contributed (two) presentations to the event: a 3= 0-minute retrospective on 25 years of using OCaml at LexiFi, and a 2-hour w= orkshop on implementing a toy version of our type-reflection extension to t= he compiler.

If you are interested, we wrote a short blog post https://www.lexifi.com/blog/ocaml/fun-= ocaml-2025/ where you will find the slides and the video for the 30-min= ute presentation, as well as the code and the slides for the 2-hour worksho= p (the video recording for this part is not yet available).

Enjoy!

Best wishes, Nicolas

Introducing oui

Nathan Rebours announced

At OCamlPro we're happy to announce o= ur new ongoing project funded by the CE= A-List: ocaml-universal-installer or oui!

oui's goal is to help teams developping applications in OCaml = to package them for their users outside the OCaml World by building binary = installers for all major platforms: Linux, Windows and macOS.

oui builds standalone installers: you just need to download an= d run the file. No need to install OCaml, Opam and to compile anything on t= he target system anymore.

The tool will be used to package and distribute Frama-C and its plugins to non opam users.

It is still in development but we'd like to present it to the community wit= h the hope that it will prove helpful to you as well.

How it works

You take care of building your application and provide oui the= list of your binaries and extra files you'd like installed alongside them = and it will assemble an installer from those.

It uses different tools and build different types of installers for all thr= ee main platfoms:

  • on Linux, we build self extracting archives using makeself.
  • on Windows, we build MSI using the = Wix6 toolset
  • on macOS, we build regular OSX installers using pkgbuild~/~produc= tbuild

We started oui on top of an older but very similar project: opam-wix. opam-wix was an opam plugin used to build= a Windows MSI from a locally installed opam package. This feature, though = not the core focus of the early development, is still available via o= pam-oui and will be extended with the ability to build installers fo= r the other supported platforms.

A tool for the community

Though it is initially developped for Frama-C's distribution, both the CEA-= List and ourselves at OCamlPro would like to make oui a commun= ity tool that can help open source OCaml developpers ship their application= s easily.

The goal of this early announcement is to gather data and feedback on other= use cases for binary installers across the OCaml Ecosystem to help us shap= e oui into the right tool from the start.

This is an ongoing project, if you'd like to follow the development, it is = publicly hosted here.

OCaml 5.4.0 released

octachron announced

We have the pleasure of celebrating the birthdays of Camille Saint-Sa=C3=AB= ns and Karl Schwarzschild by announcing the release of OCaml version 5.4.0.

Some of the highlights of OCaml 5.4.0 are:

Labelled tuples

It is now possible to add labels on tuple fields

let ( * ) (x,~dx) (y, ~dy) =3D
  x*.y, ~dx:(x *. dy +. y *. dx )

Those labeled tuples are equivalent to SML records: they are an ordered and structurally-typed variants of records. In particular this implies that partial pattern matching on tuples is only possible for labelled tuples wit= h a known type:

type t =3D float *=
 dx:float
let v (x_and_dx:t) =3D let (x,..) =3D x_and_dx in<=
/span> x

Those types are mostly intended for local types where previous code was usi= ng tuples.

Array literal syntax support for immutable arrays and= ~floatarray~s

The array literal syntax is now shared by array-like primitive types, like = 'a array, floatarray and immutable array iarray. For instance, this code

let x =3D Float.Array.of_list [0.;1.;2.]

can now be written

let x : floatarray =3D [|0.; 1.; 2.|]

This also supported in patterns

let one =3D match x wi=
th
  | [|_;y;_|] -> Some y
  | _ -> None

However array indexing still needs to go through user-defined indexing oper= ators

let (.$()) =3D Float.Array.get
let (.$()<-) =3D F=
loat.Array.set
let () =3D x.$(0) <- x.$(1)

Immutable arrays

Along with shared array literals, OCaml 5.4 adds support for immutable arra= ys.

let v: int iarray =3D [| 0; 1; 2 |]

Immutable arrays are covariant in the type of their elements, it is thus po= ssible to coerce immutable arrays with no costs at runtime:

let i1: _ iarray =3D [|object method m =3D 0 end|]
let i2 =3D ( i1 :> < > iarray)

Atomic record fields

It is now possible to mark a field of a record as atomic. Atomic operatio= ns on those fields require to use the new Atomic.Loc submodule after= accessing the location with the [%atomic.loc ...] builtin extension. For ins= tance,

type 'a mpsc_list =
=3D { mutable head:'a list; mutable tail: 'a list [@atomic] }

let rec push t x =3D
  let before =3D Atom=
ic.Loc.get ] in<=
/span>
  let after =3D x ::<=
/span> before in
  if not (Atomic.Loc.compare_and_=
set [%atomic.loc=
 t.tail]<=
/span> before after) then
    push t x
  ...

Moreover, it is forbidden to pattern match on atomic fields:

let f { head; tail } =3D tail
Error: Atomic fields (here tail) are forbidden in patterns,
       as it is difficult to reason about when the atomic read
       will happen during pattern matching: the field may be read
       zero, one or several times depending on the patterns around it.

in order to make all reads on those atomic fields explicit.

Four new standard library modules: Pair, Pqueue, Repr= , and Iarray

The standard library has been extended with four new modules:

  • Pair: functions for working on pairs
let ones =3D Pair.map_fst succ (0,1)
  • Pqueue: priority queues, generic or not
module Int_pqueue =
=3D Pqueue.MakeMin(Int)
let q =3D Int_pqueu=
e.of_list [4;0;5;7]
let some_zero =3D I=
nt_pqueue.pop_min q
  • Repr: physical and structural equality, comparison function, more generically all functions dependent on the memory representation of values.
let f =3D Repr.phys_equal (ref 0) (ref 0)
  • Iarray: functions on immutable arrays
let a =3D Iarray.init 10 Fun.id
let b =3D Iarray.map succ a

Restored "memory cleanup upon exit" mode

This mode allows to restart many time the OCaml runtime in C-driven programs that interact with OCaml libraries. It is also useful to reduce noise when tracking memory leaks in C code running the OCaml runtime. To get around cancellation issues, the restored mode currently assumes that all domains a= re joined before exiting the OCaml runtime.

A new section in the reference manual on profiling OC= aml programs on Linux and macOS

A new section in the refer= ence manual explains how to use OS specific profiling tools to profile native OCaml programs.

A lot of incremental changes:

  • Many runtime and code generation improvements
  • More than thirty new standard library functions
  • Nearly a dozen improved error messages
  • Around fifty bug fixes

Please report any unexpected behaviours on the OCaml issue tracker and post any questions or comments you might have on our discus= sion forums.

The full list of changes can be found in the full changelog. Editor note= : please follow the archive link above for the installation instructions an= d the full changelog

Happy hacking, Florian Angeletti for the OCaml team.

OCaml compiler office hours

Continuing this thread, gasche announced

The meeting went well – see the collaborative pad for notes.

I propose to have another meeting about a month from now:

on November 7th at 15:30–17:00 UTC

(I picked a different time slot from the current one, that also looks reaso= nable given previous poll results. If extra people would like to join, plea= se feel free to participate to the time-slot poll in the first post so t= hat I can tell when are good meeting times.)

@giltho thanks for noticing the language issue on the online-meeting servic= e I proposed; this is a new issue that looks like it comes from a version u= pgrade, it of course had a fine English interface when I adopted the servic= e. Let's keep jitsi.meet for now.

tutorial about compiling ocaml-5 on a ChromBook with Crostini<= /h2>

Florent Monnier announced

Hello dear list, I wrote another mini-tutorial to explain how to compile ocaml-5 on a chrome= book with crostini: http://decapode314.free.fr/ocaml2/tut/tut-ocaml-5/tut-ocaml-5.html The trick to compile ocaml-5 in this environement was the same than to comp= ile ocaml-4 in the same environement because ln -s doesn't see= m to produce the expected result. At the beginning I edited the Makefile to replace the ln= -s commands by cp commands, but an easier way is to us= e the make feature that permits you to change the value of one= of the variable from the command line which invokes make, lik= e this make LN=3Dcp.

With this trick everything was producing the expected ocaml tools with ocaml-4, but with ocaml-5, I have only been able to g= et ocamlnat and ocamlopt tools (which is enough.)

ocamlopt was installed as expected by the make install command, but ocamlnat had to be copied by hand.

If the command ocaml produces an error (cannot execute), in scripts I can still replace:

#!/usr/bin/env ocaml

by:

#!/usr/bin/env ocamlnat

By defining the same environement variables than opam I can ge= t two different ocaml version usable at the same time, one 4 version, and a= 5 version, next to each other at the same time, without using opam because opam grew up a lot, and in crostini environement= we quickly lack of space.

PS: If someone want to help finding how to get the ocaml and <= code>ocamlc commands functioning, the help will be wellcome, and I w= ill update this mini-tutorial.

dune-release-action: Automate your opam package releases with = GitHub Actions

David Sancho announced

Hi everyone =F0=9F=91=8B

I'm excited to share a new GitHub Action I've been working on: dune-rele= ase-action

If you maintain OCaml packages, you know the drill: every release involves = a ritual of commands and manual steps. You need to:

  1. Ensure your CHANGES.md is properly formatted
  2. Tag your release
  3. Run dune-release lint + distrib + submit
  4. Create a GitHub release with the correct changelog section
  5. Check the opam-repository's PR
  6. Oh shit, github token is expired
  7. Create new token without expiration (??)
  8. Retry

For me, was following this guide https://gist.github.com/anmonteiro/ab= d9275456888740758aa9f772d1992a by @anmonteiro, but it typically took ar= ound an hour per release.

dune-release-action

dune-release-action automates the entire release workflow in G= itHub Actions. Push a git tag, and the action runs dune-release for you wit= h:

  • Handles all the dune-release orchestration
  • Validates your changelog format (right tag exists, etc)
  • Creates a GitHub release with proper description (from your changelog s= ection (!!))
  • Submits a PR to opam-repository
name: Release

on:
  push:
    tags:
      - '*'

permissions:
  contents: write
  pull-requests: write

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: ocaml/setup-ocaml@v3
        with:
          ocaml-compiler: 5.3.0

      - run: opam install dune-release -y

      - uses: davesnx/dune-release-action@v1
        with:
          package-name: 'your-package'
          github-token: ${{ secrets.GH_TOKEN }}

This is very much a one-day half vibe-coded project and it's hard to test i= n many use cases, I'm sure there are edge cases and workflows I haven't con= sidered.

Looking forward to hearing your thoughts!

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.

--=-=-=--