From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org 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=s+KTz5gi; 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=TWiSCdw8; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id EA05BB80123 for ; Tue, 23 Apr 2024 13:17:29 +0100 (BST) 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=IcU469DZb01Ww7OkAc+nL1Pahm68fa+NZ6ZVqljQfU0=; b=s+KTz5giz+3eCN5889rqUJCbP61LfDKlEBcBp6rElBE1bJxtYrmb0MDv mGbI/P4V6aYeVGvOLUMet1ZpFKXrOVv0oHPZRWN0N7yVj7B6Q4LqftN3p DfZqkF6YVyb5nEP7ytyYirU6iXaZG4AhmoiAACf2xnPGQ1ZxQ8ycFjzKt g=; 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: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.07,222,1708383600"; d="scan'208,217";a="162928978" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 23 Apr 2024 14:17:27 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 8112BE0D5E; Tue, 23 Apr 2024 14:17:26 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 99900E0141 for ; Tue, 23 Apr 2024 14:17:20 +0200 (CEST) IronPort-SDR: 6627a6ce_E8ZRt2wksfhPLyd5EHDbSUmP4L1sfLn5J+d2j2pLwFvopmz 6f4M4gL0I7HAsN7bWQkWMiLmiFTwBaK+dEH1Y1g== X-IPAS-Result: =?us-ascii?q?A0FuEAD3pSdmlyIeaIFQChZ/gwRbKBkBYlczBwhIBF0Ng?= =?us-ascii?q?yw8g0+NNWSBFQGQL4FThm6BMYJpgREDGBYjFAEDAQ0uAQ4EAQIEAQEDAQIBg?= =?us-ascii?q?guCdAJPCYdKAh8GAQQ0EwECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGA?= =?us-ascii?q?QIQAQEBAQEBAQE3BRA1hTsBBS8NgkotASNRGmUJBgEBAQEBAQEBAQIBAQEiA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIIB?= =?us-ascii?q?AEHKQdHAgMLDgEIBAYTAQEjCAEGBhgjAxQBBgMCEQEXHhcBEhqCDlgBgmQDB?= =?us-ascii?q?QwGnBSbOnp/M4EBggwBAQaBCD4CAQIJAgUBDgkm2gSBYQmBSIgLCRoBJEhpA?= =?us-ascii?q?oQlCYQ3Jw+BVUSBFTWCPQdvgVABbgUdAQEBAQEXQkYRBAEGAQEGAwFDCYMlg?= =?us-ascii?q?miCOIMpfiaBbAGFWU4IFWqCJkGBGzoCL18SgQovGW+COwQFBhGBNoY1gUtLM?= =?us-ascii?q?yETAVUTGBANJCMCKT4DCQoQAhYDHRQEMBEJCyYDKgY2AhIMBgYGWyAWCQQjA?= =?us-ascii?q?wgEA1ADIHARAwQaBAsHdYFEgW0EE0QDEIEyhzuCU4M9gh6EJkuFAoF7DmqBH?= =?us-ascii?q?R1AAwttPTUUGyieLwQ4AgEsgXYlDh8ZBgIwDCYYCQUFCAwIDgIgAg0gAQQEC?= =?us-ascii?q?QUVCgwKAgMTAR0DBgUGAwQXAgEFCB8LCwIeDwOSLgsJCQcKCwMqdY4mg0+Jb?= =?us-ascii?q?kiTRxxsNAeEFoFbBgyIfYEkhzOFeog+hAWBVoU3hDSBPYpIhzOFJYIRIphAI?= =?us-ascii?q?II0hx0KgRsJgWweS4hpjBwQLAQPExOFF4F7I4ErAR0MBzMaMEMNAgeCHQEzC?= =?us-ascii?q?Qo8HA+IXIRtYhdwgmgQWlSBGwuBPDk7gkEElmNBNQEBAQEHMAIHAQoBAQMJh?= =?us-ascii?q?WIBAYMKAQEmDIFIAQE?= IronPort-PHdr: A9a23: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 UEL6gBd+A8LlolxZ/3opo3SQ80VowM= IronPort-Data: A9a23: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 w== IronPort-HdrOrdr: A9a23:SPNJo6zLQMSO41FzlP4hKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-Talos-CUID: 9a23:U2d0PW/Uccx+WCk9T86Vv0JPB9sHSy368CjJLhPhUCV4R4HFFnbFrQ== X-Talos-MUID: =?us-ascii?q?9a23=3AVcQjhA97cum9PG6DApmegyKQf+kx3JX2CFEurak?= =?us-ascii?q?h5JilFQB8CS2kih3iFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,222,1708383600"; d="scan'208,217";a="162928925" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDGW2Z6nhesSB3c+xhJwy3Ea51yqOoczqEi459?= =?us-ascii?q?mwEgHYmz6I4w2YqeG6f4xNGn90McrRhyIFVvubue/gKo15ySfjI5gGf+?= =?us-ascii?q?dXnxdxLCnSyTAdUGX/RTVstklFJ/Oy8ztUAdefhLZYs9TKXVkovgmrjo?= =?us-ascii?q?BI3fdZ6dy7jaaHqlv1szJaaQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Apr 2024 14:17:18 +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 976A5561234; Tue, 23 Apr 2024 14:17:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1713874637; bh=epcQzwOSffBygac57Wi37p4cC6TnuSgVUbva4mOxyA4=; h=From:To:Subject:Date:Message-ID; b=TWiSCdw8gLjHr2vSnLUrW0ZKQJOaWY8ydZGQyVS19rWDVX6oj250ShxheqyBo8LAW fHqqO1d/+s3XFeWHTNeeCEjCr+ltNLOVD7yuQY5s9ThjwtFNjyiOnQnXU95T72vySm HM6+OHPlrI3Q2VJUo4ulQQle/v0vu9XeUT/wqoIk= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 23 Apr 2024 14:17:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 23 14:17:18 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.459420, queueID=D3FB8561235 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: 19117 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 April 16 to 23, 2024. 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 A second beta for OCaml 5.2.0 An implementation of purely functional double-ended queues Feedback / Help Wanted: Upcoming OCaml.org Cookbook Feature Picos =E2=80=94 Interoperable effects based concurrency Ppxlib dev meetings Ortac 0.2.0 OUPS meetup april 2024 Mirage 4.5.0 released patricia-tree 0.9.0 - library for patricia tree based maps and sets OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor optimization)= framework Other OCaml News Old CWN A second beta for OCaml 5.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 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 Last week, we merged in the 5.2 branch of OCaml an update to the compiler-libs "shape" API for querying definition information from the compiler. Unfortunately, this small change of API breaks compatibility with at least odoc. Generally, we try to avoid this kind of changes during the beta releases of the compiler. However, after discussions we concluded that it will be easier on the long term to fix the API right now in order to avoid multiplying the number of supported versions of the shape API in the various OCaml developer tools . We have thus released a second beta version of OCaml 5.2.0 to give the time to developer tools to update their 5.2.0 version ahead of the release (see below for the installation instructions). Beyond this changes of API, the new beta contains three minor bug fixes and three documentation updates, which is a good sign in term of stability. As usual, you can follow the last remaining compatibility slags on the [opam readiness for 5.2.0 meta-issue]. If you find any bugs, please report them on [OCaml's issue tracker]. Currently, the release is planned for the beginning of May. If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.2.0 is available [on GitHub]. [opam readiness for 5.2.0 meta-issue] [OCaml's issue tracker] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1: =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.2.0~beta2 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the beta is also available at these addresses: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] Fine-Tuned Compiler Configuration =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.2.0~beta2+opt= ions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space-separated list of `ocaml-option-*' packages. For instance, for a `flambda' and `no-flat-float-array' switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.2.0~beta2+flambda+nffa ocaml-variants.5.2.= 0~beta2+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Changes since the first beta =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Compiler-libs API Changes =E2=80=A2 [#13001]: do not read_back entire shapes to get aliases' uids w= hen building the usages index (Ulysse G=C3=A9rard, review by Gabriel Scherer and Nathana=C3=ABlle Courant) [#13001] =E2=97=8A Bug Fixes =E2=80=A2 [#13058]: Add TSan instrumentation to caml_call_gc(), since it = may raise exceptions. (Fabrice Buoro, Olivier Nicole, Gabriel Scherer and Miod Vallat) =E2=80=A2 [#13079]: Save and restore frame pointer across Iextcall on ARM= 64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat) =E2=80=A2 [#13094]: Fix undefined behavior of left-shifting a negative nu= mber. (Antonin D=C3=A9cimo, review by Miod Vallat and Nicol=C3=A1s Ojeda B=C3= =A4r) [#13058] [#13079] [#13094] =E2=97=8A Documentation Updates =E2=80=A2 [#13078]: update Format tutorial on structural boxes to mention alignment questions. (Edwin T=C3=B6r=C3=B6k, review by Florian Angelet= ti) =E2=80=A2 [#13092]: document the existence of the `[@@poll error]' built-= in attribute (Florian Angeletti, review by Gabriel Scherer) =E2=80=A2 [#13066], update OCAMLRUNPARAM documentation for the stack size parameter l (Florian Angeletti, review by Nicol=C3=A1s Ojeda B=C3=A4r, = Tim McGilchrist, and Miod Vallat) [#13078] [#13092] [#13066] An implementation of purely functional double-ended queues =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =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: Humza Shahid 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 I have some code that might be useful to others here. I had the idea of a new purely functional implementation for double ended queues, and I implemented it ()[here]. The idea is pretty simple, and it proves to be quite fast in benchmarks. The idea is to have a record containing: =E2=80=A2 A head array representing the start of the queue, with a limit = on the number of elements it can have. =E2=80=A2 A tail array representing the end of the queue, also with a lim= it on the number of elements it can have. =E2=80=A2 A balanced binary tree based on the rope data structure. (The internal nodes pointing to other nodes contain integer metadata indicating the number of elements on the left and right subtrees, and leaf nodes contain an array of elements.) When trying to insert into either the head or tail array when the array is at max capacity, the array is either appended or prepended to the tree and the array/element we wanted to insert is now either the head or tail. I was looking for some way to test the performance and adapted (this code)[] to use it, and it's pretty fast - only about 4x slower than the standard library's mutable queue. (Although this was really implemented in mind aiming for fast access time rather than fast insertion/removal time.) It has some non-standard functions for double ended queues too, like O(log n) insert/removal/indexing at any arbitrary location (with a constant that makes this faster than on a typical binary tree - a typical binary tree contains on element per node, increasing height, but this contains arrays of elements at the leaves so more data is packed and the height is shorter). Some other people might find it useful, so here it is for others to copy-and-paste. I don't know if it's worth putting on opam (I don't have a use for this myself in any of my projects but curiosity led me to implement it.) Feedback / Help Wanted: Upcoming OCaml.org Cookbook Feature =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=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: Cuihtlauac Alvarado 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 We've just updated the cookbook: . We'd love to have your feedback on it. The corresponding PR is still the same: The visual design is not yet final, but it works. It is organized in recipes, tasks and categories. A task is something that needs to be done inside a project. A recipe is a code sample and explanation of how to perform a task using a combination of packages. Some tasks can be performed using different combination of libraries, each is a different recipe. Categories are groups of tasks or categories You'll see most tasks don't have any recipes. We hope to collect the best recipes. Categories are also open for discussion. Picos =E2=80=94 Interoperable effects based concurrency =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: polytypic 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 [Picos] is a framework for building interoperable elements such as =E2=80=A2 schedulers that multiplex large numbers of user level fibers to= run on a small number of system level threads, =E2=80=A2 mechanisms for managing fibers and for structuring concurrency, =E2=80=A2 communication and synchronization primitives, such as mutexes a= nd condition variables, message queues, STMs, and more, and =E2=80=A2 integrations with low level asynchronous IO systems, of effects based cooperative concurrent programming models. [Picos] polytypic then announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce that version 0.2.0 of Picos is now available on opam. A small core [picos] framework allows concurrent abstractions [implemented in Picos] to communicate with [Picos compatible] schedulers. In addition to the core framework, the `picos' package comes with a couple of sample schedulers and some scheduler agnostic libraries as well as bunch of auxiliary libraries. Sample schedulers: =E2=80=A2 [picos.fifos] =E2=80=94 Basic single-threaded effects based Pic= os compatible scheduler for OCaml 5. =E2=80=A2 [picos.threaded] =E2=80=94 Basic Thread based Picos compatible = scheduler for OCaml 4. Scheduler agnostic libraries: =E2=80=A2 [picos.sync] =E2=80=94 Basic communication and synchronization = primitives for Picos. =E2=80=A2 [picos.stdio] =E2=80=94 Basic IO facilities based on OCaml stan= dard libraries for Picos. =E2=80=A2 [picos.select] =E2=80=94 Basic `Unix.select' based IO event loo= p for Picos. Auxiliary libraries: =E2=80=A2 [picos.domain] =E2=80=94 Minimalistic domain API available both= on OCaml 5 and on OCaml 4. =E2=80=A2 [picos.exn_bt] =E2=80=94 Wrapper for exceptions with backtraces. =E2=80=A2 [picos.fd] =E2=80=94 Externally reference counted file descript= ors. =E2=80=A2 [picos.htbl] =E2=80=94 Lock-free hash table. =E2=80=A2 [picos.mpsc_queue] =E2=80=94 Multi-producer, single-consumer qu= eue. =E2=80=A2 [picos.rc] =E2=80=94 External reference counting tables for dis= posable resources. =E2=80=A2 [picos.thread] =E2=80=94 Minimalistic thread API available with= or without `threads.posix'. All of the above are entirely opt-in and you are free to mix-and-match with any other Picos compatible [future] schedulers and libraries implemented in Picos or develop your own. See the [reference manual] for further information. [picos] [implemented in Picos] [Picos compatible] [picos.fifos] [picos.threaded] [picos.sync] [picos.stdio] [picos.select] [picos.domain] [picos.exn_bt] [picos.fd] [picos.htbl] [picos.mpsc_queue] [picos.rc] [picos.thread] [future] [reference manual] Ppxlib dev meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=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 You can find our last meeting's notes [here]. We had three guests yesterday: @shonfeder @lubegasimon and @moazzammoriani. You are always welcome to join whether you have a specific topic you want to bring up or you just want to tag along. We'll post the link here ahead of the meeting. [here] Ortac 0.2.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: Nicolas Osborne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are very excited to announce this new Ortac release! Ortac is a set of tools that translate Gospel specifications into OCaml code and use these translations to generate programs that check at runtime that the OCaml implementation respects the Gospel specifications. You can find the project on [this repo] and install it via `opam'. This new release contains four packages: =E2=80=A2 `ortac-core' =E2=80=A2 `ortac-runtime' =E2=80=A2 `ortac-qcheck-stm' =E2=80=A2 `ortac-runtime-qcheck-stm' The main improvements that brings this release concern the `ortac-qcheck-stm' plugin (the other three packages are mainly released for compatibility reasons). `ortac-qcheck-stm' provides a plugin for Ortac. It generates QCheck-STM tests for a module specified with Gospel. QCheck-STM is a model-based testing framework and Ortac/QCheck-STM relies on the Gospel models you gave in the specifications to build the QCheck-STM tests. I'd like to highlight two of these improvements. The first one is that type invariants for what we call the system under test are now checked. Let's say you want to generate QCheck-STM tests for a fixed-size container. You can give the following specification to your type: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a t =E2=94=82 (*@ mutable model contents : 'a list =E2=94=82 model size : int =E2=94=82 with t invariant List.length t.contents <=3D t.size *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Now, the generated tests will check that the invariant is respected at initialisation of the system under test (the value of type `'a t') and that it is preserved by the functions being tested. The second improvement concerns the test failure message. In order to make the failure more informative, a message stating which part of the Gospel specifications has been violated and a small OCaml program that demonstrates the unexpected behaviour will be displayed. For example, with an artificial bug in the `Array.length' function, running the Ortac/QCheck-STM-generated test will print the following failure message: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 random seed: 172339461 =E2=94=82 generated error fail pass / total time test name =E2=94=82 [=E2=9C=97] 1 0 1 0 / 1000 0.0s Array STM tests= (generating) =E2=94=82=20 =E2=94=82 --- Failure ---------------------------------------------------= ----------------- =E2=94=82=20 =E2=94=82 Test Array STM tests failed (5 shrink steps): =E2=94=82=20 =E2=94=82 length sut =E2=94=82=20 =E2=94=82 +++ Messages ++++++++++++++++++++++++++++++++++++++++++++++++++= ++++++++++++++++++ =E2=94=82=20 =E2=94=82 Messages for test Array STM tests: =E2=94=82=20 =E2=94=82 Gospel specification violation in function length =E2=94=82=20 =E2=94=82 File "array.mli", line 7, characters 12-22: =E2=94=82 i =3D t.size =E2=94=82=20 =E2=94=82 when executing the following sequence of operations: =E2=94=82=20 =E2=94=82 open Array =E2=94=82 let protect f =3D try Ok (f ()) with e -> Error e =E2=94=82 let sut =3D make 16 'a' =E2=94=82 let r =3D length sut =E2=94=82 assert (r =3D 16) =E2=94=82 (* returned 42 *) =E2=94=82=20 =E2=94=82 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D =E2=94=82 failure (1 tests failed, 0 tests errored, ran 1 tests) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Although it has already helped find and fix some bugs, this project is still fairly new. So, feel free to try it and report any [issue]. Happy testing! [this repo] [issue] OUPS meetup april 2024 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: zapashcanon 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 The next OUPS meetup will take place on *Thursday, 25th of April* 2024. It will start at *7pm* at the *4 place Jussieu* in Paris. :warning: :trumpet: It will be in the in the *Esclangon building* (amphi Astier). :trumpet: :warning: Please, *[register on meetup ]* as soon as possible to let us know how many pizza we should order. For more details, you may check the [OUPS=E2=80=99 website ]. This month will feature the following talks : *Symbolic execution for all with [Owi] and Wasm =E2=80=93 L=C3=A9o Andr= =C3=A8s* WebAssembly (Wasm) is a new binary compilation target adopted by many high-level programming languages such as C/C++, Rust, Java, and Go. Building on this foundation, we present Owi, a toolkit to work with Wasm within the OCaml ecosystem. In particular, Owi features a reference interpreter for Wasm capable of performing both concrete and symbolic execution. In this presentation, we describe how we designed reusable components and a modular interpreter from a concrete one, enabling the sharing of code between the concrete and symbolic interpreters. Additionally, we demonstrate how it is possible to perform symbolic execution of other languages by compiling them to Wasm using the symbolic interpreter. We provide examples of symbolic execution applied to C and Rust code and describe our current work to extend this functionality to support OCaml and other garbage-collected languages by integrating WasmGC into Owi. *[Smt.ml] - A Multi Back-end Front-end for SMT Solvers in OCaml =E2=80=93 Filipe Marques* SMT solvers are crucial tools in fields such as Software Verification, Program Synthesis, and Test-Case Generation. However, using their APIs, especially in typed functional languages like OCaml, can be challenging due to their complexity and lack of user-friendly interfaces. To address this, we propose Smt.ml, an open-source library that serves as a single interface for multiple SMT solvers in OCaml. Currently supporting solvers such as Z3, Colibri2, and Bitwuzla, Smt.ml enables users to seamlessly work with different solvers using one unified syntax. The library incorporates built-in optimizations to handle both concrete and symbolic expressions efficiently. Smt.ml has been successfully integrated with Owi, an interpreter and toolkit for WebAssembly. This integration allowed Owi to perform static symbolic execution and test-case generation for WebAssembly programs. Notably, Owi was able to identify known vulnerabilities in a widely-used C data structure libraries. [register on meetup ] [OUPS=E2=80=99 website ] [Owi] [Smt.ml] Mirage 4.5.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=E2=95=90 Archive: Thomas Gazagnaire 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 On behalf of the Mirage team, I'm happy to announce the release of MirageOS 4.5.0. This was merged in `opam-repository' last week, so it should be available just in time for the upcoming [14th MirageOS hack retreat]! This release introduces a significant change in the Mirage tool by splitting the definition of command-line arguments used at configure-time and runtime. Command-line arguments used in the configure script (also called 'configuration keys' and defined in the `Key' module) are essential during the setup of module dependencies for the unikernel, allowing for specialized production of a unikernel for a given target runtime environment. On the other hand, command-line arguments that the unikernel can use a runtime (defined in the `Runtime_arg' module) are helpful for customizing deployments without altering the dependencies of the unikernels. =E2=80=A2 API changes: =E2=80=A2 There is no more `~stage' parameter for `Key.Arg.info'. =E2=80=A2 `Key' now define command-line arguments for the configuration tool. =E2=80=A2 There is a new module `Runtime_arg' to define command-line arguments for the unikernel. =E2=80=A2 As there are no more keys type `'Both', users are now expecte= d to create two separated keys in that case (one for configure-time, one for runtime) or decide if the key is useful at runtime of configure-time. =E2=80=A2 Intended use of configuration keys (values of type `'a key'): =E2=80=A2 Used to set up module dependencies of the unikernel, such as = the target (hvt, xen, etc.) and whether to use DHCP or a fixed IP address. =E2=80=A2 Enable the production of specialized unikernels suitable for specific target runtime environments and dedicated network and storage stacks. =E2=80=A2 Similar keys will produce reproducible binaries to be uploade= d to artifact repositories like Docker Hub or . =E2=80=A2 Intended use of command-line runtime arguments (values of type = `a runtime_arg'): =E2=80=A2 Allow users to customize deployments by changing device configuration, like IP addresses, secrets, block device names, etc., post downloading of binaries. =E2=80=A2 These keys don=E2=80=99t alter the dependencies of the uniker= nels. =E2=80=A2 A runtime keys is just a reference to a normal Cmdliner term. =E2=80=A2 `key_gen.ml' is not generated anymore, so users cannot refer to `Key_gen.' directly. =E2=80=A2 Any runtime argument has to be declared (using `runtime_arg' = and registered on the device (using `~runtime_args'). The value of that argument will then be passed as an extra parameter of the `connect' function of that device. =E2=80=A2 Configuration keys are not available at runtime anymore. For instance, `Key_gen.target' has been removed. =E2=80=A2 Code migration: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* in config.ml *) =E2=94=82 let key =3D =E2=94=82 let doc =3D Key.Arg.info ~doc:"A Key." ~stage:`Run [ "key"= ] in =E2=94=82 Key.(create "key" Arg.(opt_all ~stage:`Run string doc)) =E2=94=82 let main =3D main ~keys:[abstract hello] .. =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 (* in unikernel.ml *) =E2=94=82 let start _ =3D =E2=94=82 let key =3D Key_gen.hello () in =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 becomes: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* in config.ml *) =E2=94=82 let hello =3D runtime_arg ~pos:__POS__ "Unikernel.hello" =E2=94=82 let main =3D main ~runtime_args:[hello] ... =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 (* in unikernel.ml *) =E2=94=82 open Cmdliner =E2=94=82=20 =E2=94=82 let hello =3D =E2=94=82 let doc =3D Arg.info ~doc:"How to say hello." [ "hello" ] in =E2=94=82 Arg.(value & opt string "Hello World!" doc) =E2=94=82=20 =E2=94=82 let start _ hello =3D =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The [mirage-skeleton] repository and a few tutorials on have been updated and now compile with [mdx] to check for future API breakage. Documentation PRs are very welcome if you find some missing updates. We also welcome more general feedback regarding this API change. I also would like to use this announcement as a reminder that we have restarted the mirage bi-weekly calls. Check the [MirageOS mailing list] or the [MirageOS Matrix channel] for more info. The next one is planned for the 29th of April. If you are using or planning to use MirageOS (or are just curious about the project), feel free to join, it's open to everyone! Happy hacking! [14th MirageOS hack retreat] [mirage-skeleton] [mdx] [MirageOS mailing list] [MirageOS Matrix channel] patricia-tree 0.9.0 - library for patricia tree based maps and sets =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=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: Dorian Lesbre 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 I'm happy to announce the release of a new `patricia-tree' library, version 0.9.0 on opam. This library that implements sets and maps as Patricia Trees, as described in Okasaki and Gill's 1998 paper [/Fast mergeable integer maps/]. It is a space-efficient prefix trie over the big-endian representation of the key's integer identifier. For full details, visit see [the documentation] or [the source on github]. [/Fast mergeable integer maps/] [the documentation] [the source on github] Features =E2=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 Similar to OCaml's `Map' and `Set', using the same function nam= es when possible and the same convention for order of arguments. This should allow switching to and from Patricia Tree with minimal effort. =E2=80=A2 The functor parameters (`KEY' module) requires an injective `to= _int : t -> int' function instead of a `compare' function. `to_int' should be fast, injective, and only return positive integers. This works well with [hash-consed] types. =E2=80=A2 The Patricia Tree representation is stable, contrary to maps, inserting nodes in any order will return the same shape. This allows different versions of a map to share more subtrees in memory, and the operations over two maps to benefit from this sharing. The functions in this library attempt to **maximally preserve sharing and benefit from sharing**, allowing very important improvements in complexity and running time when combining maps or sets is a frequent operation. =E2=80=A2 Since our Patricia Tree use big-endian order on keys, the maps = and sets are sorted in increasing order of keys. We only support positive integer keys. This also avoids a bug in Okasaki's paper discussed in [/QuickChecking Patricia Trees/] by Jan Mitgaard. =E2=80=A2 Supports generic maps and sets: a `'m map' that maps `'k key' to `('k, 'm) value'. This is especially useful when using [GADTs] for the type of keys. This is also sometimes called a dependent map. =E2=80=A2 Allows easy and fast operations across different types of maps = and set (e.g. an intersection between a map and a set), since all sets and maps, no matter their key type, are really positive integer sets or maps. =E2=80=A2 Multiple choices for internal representation (`NODE'), which al= lows for efficient storage (no need to store a value for sets), or using weak nodes only (values removed from the tree if no other pointer to it exists). This system can also be extended to store size information in nodes if needed. =E2=80=A2 Exposes a common interface (`view') to allow users to write the= ir own pattern matching on the tree structure without depending on the `NODE' being used. [hash-consed] [/QuickChecking Patricia Trees/] [GADTs] Comparison to other OCaml libraries =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=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 ptmap and ptset There are other implementations of Patricia Tree in OCaml, namely [ptmap] and [ptset]. These are smaller and closer to OCaml's built-in Map and Set, however: =E2=80=A2 Our library allows using any type `key' that comes with an inje= ctive `to_int' function, instead of requiring `key =3D int'. =E2=80=A2 We support generic (heterogeneous) types for keys/elements. =E2=80=A2 We support operations between sets and maps of different types. =E2=80=A2 We use a big-endian representation, allowing easy access to min= /max elements of maps and trees. =E2=80=A2 Our interface and implementation tries to maximize the sharing between different versions of the tree, and to benefit from this memory sharing. Theirs do not. =E2=80=A2 These libraries work with older version of OCaml (`>=3D 4.05' I believe), whereas ours requires OCaml `>=3D 4.14' =E2=80=A2 Our keys are limited to positive integers. [ptmap] [ptset] =E2=97=8A dmap Additionally, there is a dependent map library: [dmap]. It allows creating type safe dependent maps similar to our heterogeneous maps. However, its maps aren't Patricia trees. They are binary trees build using a (polymorphic) comparison function, similarly to the maps of the standard library. Another difference is that the type of values in the map is independent of the type of the keys, allowing keys to be associated with different values in different maps. i.e. we map `'a key' to any `('a, 'b) value' type, whereas dmap only maps `'a key' to `'a'. `dmap' also works with OCaml `>=3D 4.12', whereas we require OCaml `>=3D 4.14'. [dmap] OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor optimization)= framework =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=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: Lukasz Stafiniak 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 OCANNL 0.3.2 is out now. Thanks! 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 [Creating the SyntaxDocumentation Command - Part 1: Merlin] =E2=80=A2 [Speeding up MirageVPN and use it in the wild] =E2=80=A2 [Frama-C Days 2024] [the ocaml.org blog] [Creating the SyntaxDocumentation Command - Part 1: Merlin] [Speeding up MirageVPN and use it in the wild] [Frama-C Days 2024] 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 April 16 to 23, 2024.

A second beta for OCaml 5.2.0

octachron announced

Last week, we merged in the 5.2 branch of OCaml an update to the compiler-l= ibs "shape" API for querying definition information from the compiler.

Unfortunately, this small change of API breaks compatibility with at least = odoc. Generally, we try to avoid this kind of changes during the beta releases of the compiler. However, after discussions we con= cluded that it will be easier on the long term to fix the API right now in order to avoid multiplying the number of supported version= s of the shape API in the various OCaml developer tools .

We have thus released a second beta version of OCaml 5.2.0 to give the time= to developer tools to update their 5.2.0 version ahead of the release (see below for the installation instructions).

Beyond this changes of API, the new beta contains three minor bug fixes and= three documentation updates, which is a good sign in term of stability.

As usual, you can follow the last remaining compatibility slags on the opam readines= s for 5.2.0 meta-issue.

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

Currently, the release is planned for the beginning of May.

If you are interested in full list of features and bug fixes of the new OCa= ml version, the updated change log for OCaml 5.2.0 is available on GitHub.

Installation Instructions

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

opam update
opam switch create 5.2.0~beta2

The source code for the beta is also available at these addresses:

Fine-Tuned Compiler Configuration

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

opam update
opam switch create <switch_name> ocaml-variants.5.2.0~beta2+options &=
lt;option_list>

where option_list is a space-separated list of ocaml-opt= ion-* packages. For instance, for a flambda and n= o-flat-float-array switch:

opam switch create 5.2.0~beta2+flambda+nffa oc=
aml-variants.5.2.0~beta2+options ocaml-option-flambda ocaml-option-no-flat-=
float-array

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

Changes since the first beta

  • Compiler-libs API Changes
    • #13001: do = not read_back entire shapes to get aliases' uids when building the usages index (Ulysse G=C3=A9rard, review by Gabriel Scherer and Nathana=C3=ABlle Courant= )
  • Bug Fixes
    • #13058: Add= TSan instrumentation to caml_call_gc(), since it may raise exceptions. (Fabrice Buoro, Olivier Nicole, Gabriel Scherer and Miod Vallat)
    • #13079: Sav= e and restore frame pointer across Iextcall on ARM64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat)
    • #13094: Fix= undefined behavior of left-shifting a negative number. (Antonin D=C3=A9cimo, review by Miod Vallat and Nicol=C3=A1s Ojeda B=C3=A4r= )
  • Documentation Updates
    • #13078: upd= ate Format tutorial on structural boxes to mention alignment questions. (Edwin T=C3=B6r=C3=B6k, review by Florian Angeletti)
    • #13092: doc= ument the existence of the [@@poll error] built-in attribute (Florian Angeletti, review by Gabriel Scherer)
    • #13066, upd= ate OCAMLRUNPARAM documentation for the stack size parameter l (Florian Angeletti, review by Nicol=C3=A1s Ojeda B=C3=A4r, Tim McGilchrist,= and Miod Vallat)

An implementation of purely functional double-ended queues

Humza Shahid announced

I have some code that might be useful to others here. I had the idea of a n= ew purely functional implementation for double ended queues, and I implemented it (https://github.com/hummy123/bro-deque)[here].

The idea is pretty simple, and it proves to be quite fast in benchmarks.=20

The idea is to have a record containing:=20

  • A head array representing the start of the queue, with a limit on the n= umber of elements it can have.
  • A tail array representing the end of the queue, also with a limit on th= e number of elements it can have.
  • A balanced binary tree based on the rope data structure. (The internal = nodes pointing to other nodes contain integer metadata indicating the numbe= r of elements on the left and right subtrees, and leaf nodes contain an arr= ay of elements.)

When trying to insert into either the head or tail array when the array is = at max capacity, the array is either appended or prepended to the tree and the array/element we wanted to insert is now either the hea= d or tail.

I was looking for some way to test the performance and adapted (this code)[https://discuss.ocaml.org/t/ocaml-speed-recursive-fu= nction-optimization/13502/3] to use it, and it's pretty fast - only abo= ut 4x slower than the standard library's mutable queue. (Although this was rea= lly implemented in mind aiming for fast access time rather than fast insertion/removal time.)

It has some non-standard functions for double ended queues too, like O(log = n) insert/removal/indexing at any arbitrary location (with a constant that makes this faster than on a typical binary tree - a typical= binary tree contains on element per node, increasing height, but this contains arrays of elements at the leaves so more data is = packed and the height is shorter).=20

Some other people might find it useful, so here it is for others to copy-an= d-paste. I don't know if it's worth putting on opam (I don't have a use for this myself in any of my projects but curiosity led me= to implement it.)

Feedback / Help Wanted: Upcoming OCaml.org Cookbook Feature

Cuihtlauac Alvarado announced

We've just updated the cookbook: https://staging.ocaml.org/cookbook. We'd love to have your feedbac= k on it. The corresponding PR is still the same: ht= tps://github.com/ocaml/ocaml.org/pull/1839

The visual design is not yet final, but it works. It is organized in recipe= s, tasks and categories.

A task is something that needs to be done inside a project. A recipe is a c= ode sample and explanation of how to perform a task using a combination of packages. Some tasks can be performed using differen= t combination of libraries, each is a different recipe. Categories are groups of tasks or categories

You'll see most tasks don't have any recipes. We hope to collect the best r= ecipes. Categories are also open for discussion.

Picos =E2=80=94 Interoperable effects based concurrency

polytypic announced

Picos is a framewo= rk for building interoperable elements such as

  • schedulers that multiplex large numbers of user level fibers to run on = a small number of system level threads,
  • mechanisms for managing fibers and for structuring concurrency,
  • communication and synchronization primitives, such as mutexes and condi= tion variables, message queues, STMs, and more, and
  • integrations with low level asynchronous IO systems,

of effects based cooperative concurrent programming models.

polytypic then announced

I'm happy to announce that version 0.2.0 of Picos is now available on opam.

A small core picos framework allows concurrent abstractions implemented in Picos to communicate with Picos compatible schedulers.

In addition to the core framework, the picos package comes wit= h a couple of sample schedulers and some scheduler agnostic libraries as well as bunch of auxiliary libraries.

Sample schedulers:

  • picos.fifos =E2=80=94 Basic single-threaded effects bas= ed Picos compatible scheduler for OCaml 5.
  • picos.threaded =E2=80=94 Basic Thread based Picos co= mpatible scheduler for OCaml 4.

Scheduler agnostic libraries:

  • picos.sync =E2=80=94 Basic communication and synchroniza= tion primitives for Picos.
  • picos.stdio =E2=80=94 Basic IO facilities based on OCam= l standard libraries for Picos.
  • picos.select =E2=80=94 Basic Unix.select = based IO event loop for Picos.

Auxiliary libraries:

  • picos.domain =E2=80=94 Minimalistic domain API availab= le both on OCaml 5 and on OCaml 4.
  • picos.exn_bt =E2=80=94 Wrapper for exceptions with bac= ktraces.
  • picos.fd =E2=80=94 Externally reference counted file descr= iptors.
  • picos.htbl =E2=80=94 Lock-free hash table.
  • picos.mpsc_queue =E2=80=94 Multi-producer, single-= consumer queue.
  • picos.rc =E2=80=94 External reference counting tables for = disposable resources.
  • picos.thread =E2=80=94 Minimalistic thread API availab= le with or without threads.posix.

All of the above are entirely opt-in and you are free to mix-and-match with= any other Picos compatible future schedulers and libraries implemented in Picos or develop your own.

See the reference manual for further information.

Ppxlib dev meetings

Nathan Rebours announced

You can find our last meeting's notes here.

We had three guests yesterday: @shonfeder @lubegasimon and @moazzammoriani.

You are always welcome to join whether you have a specific topic you want t= o bring up or you just want to tag along. We'll post the link here ahead of the meeting.

Ortac 0.2.0

Nicolas Osborne announced

We are very excited to announce this new Ortac release!

Ortac is a set of tools that translate Gospel specifications into OCaml cod= e and use these translations to generate programs that check at runtime that the OCaml implementation respects the Gospel specific= ations.

You can find the project on this repo and install it via opam.

This new release contains four packages:

  • ortac-core
  • ortac-runtime
  • ortac-qcheck-stm
  • ortac-runtime-qcheck-stm

The main improvements that brings this release concern the ortac-qche= ck-stm plugin (the other three packages are mainly released for compatibility reasons).

ortac-qcheck-stm provides a plugin for Ortac. It generates QCh= eck-STM tests for a module specified with Gospel. QCheck-STM is a model-based testing framework and Ortac/QCheck-STM relies on the Gospel mod= els you gave in the specifications to build the QCheck-STM tests.

I'd like to highlight two of these improvements.

The first one is that type invariants for what we call the system under tes= t are now checked. Let's say you want to generate QCheck-STM tests for a fixed-size container. You can give the following spe= cification to your type:

type 'a t
(*@ mutable model contents : 'a list
    model size : int
    with t invariant Li=
st.length t.contents <=3D t.size *)

Now, the generated tests will check that the invariant is respected at init= ialisation of the system under test (the value of type 'a t) and that it is preserved by the functions being tested.

The second improvement concerns the test failure message. In order to make = the failure more informative, a message stating which part of the Gospel specifications has been violated and a small OCaml program th= at demonstrates the unexpected behaviour will be displayed.

For example, with an artificial bug in the Array.length functi= on, running the Ortac/QCheck-STM-generated test will print the following failure message:

random seed: 172339461
generated error fail pass / total     time test name
[=E2=9C=97]    1    0    1    0 / 1000     0.0s Array STM tests (generating)

--- Failure ---------------------------------------------------------------=
-----

Test Array STM tests failed (5 shrink steps):

   length sut

+++ Messages ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
++++++

Messages for test Array STM tests:

Gospel specification violation in function length

  File "array.mli", line 7, characters 12-22:
    i =3D t.size

when executing the following sequence of operations:

  open Array
  let protect f =3D try Ok (f ()) with e -> Error e
  let sut =3D make 16 'a'
  let r =3D length sut
  assert (r =3D 16)
  (* returned 42 *)

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D
failure (1 tests failed, 0 tests errored, ran 1 tests)

Although it has already helped find and fix some bugs, this project is stil= l fairly new. So, feel free to try it and report any issue.

Happy testing!

OUPS meetup april 2024

zapashcanon announced

The next OUPS meetup will take place on Thursday, 25th of April 2024= . It will start at 7pm at the 4 place Jussieu in Paris.

:warning: :trumpet: It will be in the in the Esclangon building (amp= hi Astier). :trumpet: :warning:

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

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

This month will feature the following talks :

Symbolic execution for all with Owi and Wasm – L=C3=A9o Andr=C3=A8s

WebAssembly (Wasm) is a new binary compilation target adopted by many high-= level programming languages such as C/C++, Rust, Java, and Go. Building on this foundation, we present Owi, a toolkit to work with Was= m within the OCaml ecosystem. In particular, Owi features a reference interpreter for Wasm capable of performing both concrete and sy= mbolic execution. In this presentation, we describe how we designed reusable components and a= modular interpreter from a concrete one, enabling the sharing of code between the concrete and symbolic interpreters. Additionall= y, we demonstrate how it is possible to perform symbolic execution of other languages by compiling them to Wasm using the symbolic i= nterpreter. We provide examples of symbolic execution applied to C and Rust code and describe our current work to extend this fun= ctionality to support OCaml and other garbage-collected languages by integrating WasmGC into Owi.

Smt.ml - A Multi B= ack-end Front-end for SMT Solvers in OCaml – Filipe Marques

SMT solvers are crucial tools in fields such as Software Verification, Prog= ram Synthesis, and Test-Case Generation. However, using their APIs, especially in typed functional languages like OCaml, can be cha= llenging due to their complexity and lack of user-friendly interfaces. To address this, we propose Smt.ml, an open-source library that= serves as a single interface for multiple SMT solvers in OCaml. Currently supporting solvers such as Z3, Colibri2, and Bitwuzla, Smt= .ml enables users to seamlessly work with different solvers using one unified syntax. The library incorporates built-in optimiz= ations to handle both concrete and symbolic expressions efficiently. Smt.ml has been successfully integrated with Owi, an interpret= er and toolkit for WebAssembly. This integration allowed Owi to perform static symbolic execution and test-case generation for WebAs= sembly programs. Notably, Owi was able to identify known vulnerabilities in a widely-used C data structure libraries.

Mirage 4.5.0 released

Thomas Gazagnaire announced

On behalf of the Mirage team, I'm happy to announce the release of MirageOS= 4.5.0. This was merged in opam-repository last week, so it should be available just in time for the upcoming 14th MirageOS hack retreat!

This release introduces a significant change in the Mirage tool by splittin= g the definition of command-line arguments used at configure-time and runtime. Command-line arguments used in the configure sc= ript (also called 'configuration keys' and defined in the Key module) are essential during the setup of module dependenc= ies for the unikernel, allowing for specialized production of a unikernel for a given target runtime environment. On the other hand, comman= d-line arguments that the unikernel can use a runtime (defined in the Runtime_arg module) are helpful for customizin= g deployments without altering the dependencies of the unikernels.

  • API changes:
    • There is no more ~stage parameter for Key.Arg.info.
    • Key now define command-line arguments for the configuratio= n tool.
    • There is a new module Runtime_arg to define command-line a= rguments for the unikernel.
    • As there are no more keys type 'Both, users are now expect= ed to create two separated keys in that case (one for configure-time, one f= or runtime) or decide if the key is useful at runtime of configure-time.
  • Intended use of configuration keys (values of type 'a key):
    • Used to set up module dependencies of the unikernel, such as the target= (hvt, xen, etc.) and whether to use DHCP or a fixed IP address.
    • Enable the production of specialized unikernels suitable for specific t= arget runtime environments and dedicated network and storage stacks.
    • Similar keys will produce reproducible binaries to be uploaded to artif= act repositories like Docker Hub or = https://builds.robur.coop/.
  • Intended use of command-line runtime arguments (values of type a = runtime_arg):
    • Allow users to customize deployments by changing device configuration, = like IP addresses, secrets, block device names, etc., post downloading of b= inaries.
    • These keys don=E2=80=99t alter the dependencies of the unikernels.
    • A runtime keys is just a reference to a normal Cmdliner term.
  • key_gen.ml is not generated anymore, so users cannot refer= to Key_gen.<key_name> directly.
    • Any runtime argument has to be declared (using runtime_arg= and registered on the device (using ~runtime_args). The value= of that argument will then be passed as an extra parameter of the co= nnect function of that device.
    • Configuration keys are not available at runtime anymore. For instance, = Key_gen.target has been removed.
  • Code migration:

      (* in co=
    nfig.ml *)
     let key =3D
       let doc =3D Key.Ar=
    g.info ~doc:"A Key." ~stage:`Run [ =
    "key" ] in
       Key.(create "key" Arg.(opt_all=
     ~stage:`Run string doc))
    let main =3D main ~=
    keys:[abstract hello] ..
    
    (* in unik=
    ernel.ml *)
    let start _ =
    =3D
      let key =3D Key_gen=
    .hello () in
      ...
    

    becomes:

    (* in conf=
    ig.ml *)
    let hello =3D runtime_arg ~pos:__POS__ "Unikernel.hello"
    let main =3D main ~=
    runtime_args:[hello] ...
    
    (* in unik=
    ernel.ml *)
    open Cmdliner
    
    let hello =3D
      let doc =3D Arg.info ~doc:"How to say hello." [ "hel=
    lo" ] in
      Arg.(value & opt string "Hello Wor=
    ld!" doc)
    
    let start _ =
    hello =3D
      ...
    

The mirage-skeleton repository and a few tutorials on https://= mirage.io have been updated and now compile with mdx to check for future API breakage. Documentation PRs are very welcome if you find some missing updates. We also welcome more general= feedback regarding this API change.

I also would like to use this announcement as a reminder that we have resta= rted the mirage bi-weekly calls. Check the MirageOS mailing list or the MirageO= S Matrix channel for more info. The next one is planned for the 29th of April. If you are using or planning to use MirageOS= (or are just curious about the project), feel free to join, it's open to everyone!

Happy hacking!

patricia-tree 0.9.0 - library for patricia tree based maps and= sets

Dorian Lesbre announced

I'm happy to announce the release of a new patricia-tree libra= ry, version 0.9.0 on opam.

This library that implements sets and maps as Patricia Trees, as described = in Okasaki and Gill's 1998 paper Fast mergeable integer maps. It is a space-efficient prefix trie over the big-endian representation of the = key's integer identifier.

For full details, visit see th= e documentation or the source on github.

Features

Comparison to other OCaml libraries

  • ptmap and ptset

    There are other implementations of Patricia Tree in OCaml, namely ptmap and ptset. These are smal= ler and closer to OCaml's built-in Map and Set, however:

    • Our library allows using any type key that comes with an i= njective to_int function, instead of requiring key =3D i= nt.
    • We support generic (heterogeneous) types for keys/elements.
    • We support operations between sets and maps of different types.
    • We use a big-endian representation, allowing easy access to min/max ele= ments of maps and trees.
    • Our interface and implementation tries to maximize the sharing between = different versions of the tree, and to benefit from this memory sharing. Th= eirs do not.
    • These libraries work with older version of OCaml (>=3D 4.05 I believe), whereas ours requires OCaml >=3D 4.14
    • Our keys are limited to positive integers.
  • dmap

    Additionally, there is a dependent map library: dmap. It allows creating type safe dependent maps similar to our heterogeneous maps. However, its maps aren't Patricia t= rees. They are binary trees build using a (polymorphic) comparison function, similarly to the maps of the standard library. Another= difference is that the type of values in the map is independent of the type of the keys, allowing keys to be associated with di= fferent values in different maps. i.e. we map 'a key to any ('a, 'b) value type, whereas dmap only maps 'a key to 'a.

    dmap also works with OCaml >=3D 4.12, whereas = we require OCaml >=3D 4.14.

OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor= optimization) framework

Lukasz Stafiniak announced

OCANNL 0.3.2 is out now. Thanks!

Other OCaml News

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.

--=-=-=--