Hello Here is the latest OCaml Weekly News, for the week of January 11 to 18, 2022.
Table of Contents ───────────────── Blog post: Writing a Game Boy emulator in OCaml Bogue, the OCaml GUI V3.ocaml.org: getting ready to launch New release of Windows DKML with system compiler and easy Opam switch creation Cross-compiling OCaml with GitHub Actions First announcement of Bechamel An Update on the State of the PPX Ecosystem and ppxlib's Transition Become an Outreachy Mentor: support the growth and diversity of the OCaml community Cmon 0.1, a printer that shares Old CWN Blog post: Writing a Game Boy emulator in OCaml ═══════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/blog-post-writing-a-game-boy-emulator-in-ocaml/9131/1> Lin Oshitani announced ────────────────────── I have written a blog post to share my experience of writing a Game Boy emulator in OCaml. I will cover things like: • Overview of the Game Boy architecture. • Using functors to implement testable modules. • Using GADTs to encode the Game Boy instruction set. • Using test ROMs and `ppx_expect' to implement the emulator in [_exploratory programming_] style. • Finding bottlenecks and improving performance. • General thoughts on OCaml. Please take a look if you are interested and/or share with anyone who might be interested. Also, let me know if you have any questions or comments. Thanks! <https://linoscope.github.io/writing-a-game-boy-emulator-in-ocaml/> [_exploratory programming_] <https://blog.janestreet.com/repeatable-exploratory-programming/> Bogue, the OCaml GUI ════════════════════ Archive: <https://discuss.ocaml.org/t/ann-bogue-the-ocaml-gui/9099/7> Deep in this thread, octachron asked ──────────────────────────────────── Looking at the dependencies, I noticed that you also wrote a binding to `SDL_ttf'. I am wondering if it would be enough to provide a SDL-based reimplementation of the `Graphics' library (with exactly the same interface)? It could be a nice way to have a pedagogical graphical API which is just a front-end for a full graphical library. sanette replied ─────────────── Yes, I think it would be fairly easy. Looking at the `Graphics' API, the only things that are not included in `SDL~+~SDL_ttf~+~SDL_image' are graphics primitives like (filled) ellipses and (filled) polygons. One could write bindings to `SDL_gfx' (*) for these, but it's more fun to program them directly in `ocaml' ;) (*) in fact they already exist, <https://github.com/fccm/tsdl-gfx> V3.ocaml.org: getting ready to launch ═════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/v3-ocaml-org-getting-ready-to-launch/9146/1> Anil Madhavapeddy announced ─────────────────────────── In my [previous post this summer] about the upcoming revision of the website, I gave an overview of where we were headed and presented a roadmap for OCaml's online presence. Since August 2021, we've made considerable progress. We're on track to launch the website in February 2022 (only a couple of months beyond my summer prediction!), and the roadmap after that is becoming clearer thanks to all your feedback. *You can see it live at <https://v3.ocaml.org/>, with the package search available at [v3.ocaml.org/packages]* Let's dive into it! [previous post this summer] <https://discuss.ocaml.org/t/v3-ocaml-org-a-roadmap-for-ocamls-online-presence/8368> [v3.ocaml.org/packages] <https://v3.ocaml.org/packages> Update ╌╌╌╌╌╌ Until August 2021, we had been working on the foundations for v3: the user flows, sitemap, and the reusable infrastructure for the data used in ocaml.org. With all the infrastructure and data ready, our efforts since have been focused on completing the frontend. One of the clearest priorities we had from community feedback was to ensure that the unified package documentation gets to the live site as soon as possible. The build process for this is not trivial, as it involves combining the outputs of 20,000+ opam packages with the rest of the website, while maintaining a reasonable developer experience for the main site. We have therefore merged the various frontend and backend codebases into a single OCaml-based one. We've merged the NextJS / ReScript / Tailwind codebase to the backend server that serves the package documentation. This has allowed us to consolidate our technology stack and simplify our continuous deployment story, but also to directly serve the website from a pure OCaml stack (using packages from our own community such as Dream and ocaml-tls). We're deeply grateful to the ReScript team for the technology that let us prototype the new revision of the website so quickly, and to implement the templates we're now using. Here's an overview of the sitemap and all the pages we've implemented. • [Homepage] • [About] • [Industrial users] • [Academic users] • [Success stories] • [Success story] • [Learn] • [Books] • [Releases] • [Release] • [Papers] • [Tutorial] • [Best practices] • [Problems] • [Manual] • [Packages] • [Packages search] • [Package] • [Package documentation] • [Community] • [Events] • [Workshop] • [Opportunities] • [Opportunity] • [Blog] • Legal • [Carbon footprint] In addition to the frontend work, here are some backend highlights: • A global navigation bar on the package documentaion. You can now navigate through all package libraries from the navbar (by @TheLortex in [#86]) • A toplevel on the homepage (by @tmattio, @patricoferris and @jonludlam in [#106], [#135] and [#159]) • Added redirections from current ocaml.org URLs • An internationalisation framework that serves pages in different languages. The framework exists, but the page translations will come later (by @tmattio in [#84]) • A code-highlighting library that adds code highlighting in the tutorials (by @patricofferis in [#108]) • Handled /Let's Encrypt/ certificate renewals and HTTPS redirects (by @tmattio and @patricofferis in [#182]) See the full changelog here: <https://github.com/ocaml/v3.ocaml.org-server/blob/main/CHANGES.md>. As mentioned above, we are feature complete, so we will be reviewing the site to get final approval from @xavierleroy and the core development team to launch the new site in a few weeks. We still have some work to do until then, but we'll dedicate these next few weeks to receive community feedback and make any appropriate changes. So now is the time to give us the feedback you have! You can do this by replying to this post or opening GitHub issues on the repository [ocaml/v3.ocaml.org-server]. Mostly, we're hoping to receive actionable feedback such as: • Are you able to find all the information you're expecting to find on the website? • Do you find the documentation (both the learn section and package documentation) usable? • Do you find some design elements make the website hard to use (e.g., for color blind folks)? Also, please don't hesitate to open a [GitHub Issue] if you notice any bugs. As you know, the release of OCaml 5.00.0, including Multicore support, is coming in 2022, so the timing of the v3 website launch is not coincidental. When OCaml 5.00.0 is released, the website will serve as an entry point for people new to OCaml, so we need to be ready with a usuable website, helpful documentation, clear package sites, etc. All your feedback and insights on how we can do better is greatly appreciated. [Homepage] <https://v3.ocaml.org/> [About] <https://v3.ocaml.org/about> [Industrial users] <https://v3.ocaml.org/industrial-users> [Academic users] <https://v3.ocaml.org/academic-users> [Success stories] <https://v3.ocaml.org/success-stories> [Success story] <https://v3.ocaml.org/success-stories/jane-street> [Learn] <https://v3.ocaml.org/learn> [Books] <https://v3.ocaml.org/books> [Releases] <https://v3.ocaml.org/releases> [Release] <https://v3.ocaml.org/releases/4.12.0> [Papers] <https://v3.ocaml.org/papers> [Tutorial] <https://v3.ocaml.org/learn/up-and-running-with-ocaml> [Best practices] <https://v3.ocaml.org/learn/best-practices> [Problems] <https://v3.ocaml.org/problems> [Manual] <https://v3.ocaml.org/manual/index.html> [Packages] <https://v3.ocaml.org/packages> [Packages search] <https://v3.ocaml.org/packages/search> [Package] <https://v3.ocaml.org/p/dream> [Package documentation] <https://v3.ocaml.org/p/dream/1.0.0~alpha2/doc/index.html> [Community] <https://v3.ocaml.org/community> [Events] <https://v3.ocaml.org/events> [Workshop] <https://v3.ocaml.org/workshops/ocaml-workshop-2021> [Opportunities] <https://v3.ocaml.org/opportunities> [Opportunity] <https://v3.ocaml.org/opportunities/1> [Blog] <https://v3.ocaml.org/blog> [Carbon footprint] <https://v3.ocaml.org/carbon-footprint> [#86] <https://github.com/ocaml/v3.ocaml.org-server/pull/86> [#106] <https://github.com/ocaml/v3.ocaml.org-server/pull/106> [#135] <https://github.com/ocaml/v3.ocaml.org-server/pull/135> [#159] <https://github.com/ocaml/v3.ocaml.org-server/pull/159> [#84] <https://github.com/ocaml/v3.ocaml.org-server/pull/84> [#108] <https://github.com/ocaml/v3.ocaml.org-server/pull/108> [#182] <https://github.com/ocaml/v3.ocaml.org-server/pull/182> [ocaml/v3.ocaml.org-server] <https://github.com/ocaml/v3.ocaml.org-server> [GitHub Issue] <https://github.com/ocaml/v3.ocaml.org-server> What's Next? ╌╌╌╌╌╌╌╌╌╌╌╌ Launching the website is the first step on our roadmap to improve OCaml's online presence. As mentioned above, the immediate goal is to be ready for this OCaml 5.00.0 release. With this in mind, for the next few months, we'll focus on improving the documentation and ensuring it includes good user pathways to learn about Domains, Effects, and generally how to write concurrent programs in OCaml. In addition to the documentation, some of the other projects on our roadmap are: • An online editor integrated in ocaml.org (aka a Playground) • Toplevels for all the packages that compile to JavaScript This is an exciting time! Stay tuned! How Can You help? ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ We need your help! Until now, the development and design of the new site has been driven by a small team of people from Solvuu, OCaml Labs, Tarides, the University of Cambridge and individual contributors from our community. This was useful to get the momentum we needed to deliver on all the feedback from the community (package documentation, job board, new blog, etc.), but OCaml.org is a community project and needs to be driven by all of us. In particular, we built what we hope is a good framework to represent the community with pages like: • A job board • The OCaml blog • The meetings and workshops • The industrial users and academic users • The success stories Now that the framework is there, we need your help to contribute to these pages, allowing us to serve great content and make the pages useful. Job Board ┄┄┄┄┄┄┄┄┄ The job board is an experiment. We're hoping that we'll get enough content on it so it's useful for people looking for OCaml positions. To do this, we need more job posts. If you are hiring OCaml developers, you can add your job posts here: <https://github.com/ocaml/v3.ocaml.org-server/blob/main/data/jobs.yml> Blog ┄┄┄┄ The previous blog contained a lot of articles that had nothing to do with OCaml, as it was an unmonitored RSS/Atom aggregator. A long term project is to build a decentralised RSS feed for the OCaml community to publish blog posts about OCaml. In the interim, we can keep using those RSS feeds but also list the article IDs we want to display. If you have a blog about OCaml, you can add your RSS feed and list of articles here: <https://github.com/ocaml/v3.ocaml.org-server/blob/main/data/news-sources.yml> We would also like to integrate the [Caml Weekly News] (which recently celebrated its [second decade!]) directly onto the main ocaml.org website. [Caml Weekly News] <https://alan.petitepomme.net/cwn/index.html> [second decade!] <https://discuss.ocaml.org/t/twenty-years-of-ocaml-weekly-news/8869> Events ┄┄┄┄┄┄ At the moment, the Events pages lists the OCaml workshops and the Meetups. If you're organising events, don't hesitate to put them here: <https://github.com/ocaml/v3.ocaml.org-server/blob/main/data/meetups.yml> Perhaps we can advertise new events from the website, if that helps organising your events. Success Stories ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ In the new website, we've revamped the success stories to contain detailed company descriptions and the way they use OCaml, including which challenges their business faced and how OCaml helped overcome them. If you're using OCaml, you can write a success story for your business here: <https://github.com/ocaml/v3.ocaml.org-server/tree/main/data/success_stories/en> Tutorials and Manual ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ As mentioned above, we'll be revamping the documentation in the next few months. This is a large project with a lot of content to write, so we'll need the community's help. If you're interesting in contributing, don't hesitate to reach out at <thibaut.mat...@gmail.com> to @tmattio. The OCaml manual in particular is rendered using the old style, and we are planning to port it to odoc in order to fit in with the new style and also to cross-reference into the API documentation. (this requires more discussions with the core development team, and @octachron has begun looking at it). Package Documentation ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ Now that we have a great package site with documentation, it's time to write great documentation for your packages! The `odoc' maintainers worked on some guidelines on how to write `odoc' files: <https://ocaml.github.io/odoc/odoc_for_authors.html> We'll also be integrating toplevels for the packages you publish on Opam. It will use js_of_ocaml, so if you've published packages that should be compatible with js_of_ocaml, you can start making sure they are before we roll out the toplevels in the package documentation. Acknowledgements ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ Thank you to everyone who contributed to the development of this new version of the website! In particular: • Ashish Agarwal (Solvuu) • Kanishka Azimi (Solvuu) • Richard Davison (Solvuu) • Patrick Ferris (OCaml Labs) • Gemma Gordon (OCaml Labs) • Isabella Leandersson (OCaml Labs) • Thibaut Mattio (Tarides) • Anil Madhavapeddy (University of Cambridge) For the groundwork on rethinking the sitemap, user flows, new content, design, and frontend and package docs! • Jon Ludlam (OCaml Labs) • Jules Aguillon (Tarides) • Lucas Pluvinage (Tarides) For the work on the package site infrastructure and UI! • Paul-Elliot Anglès d'Auriac (Tarides) For meticulously going through the website to find issues. • Isabella Leandersson (OCaml Labs) • Asaad Mahmood (Tarides) For the work on the designs and bringing them to life on the frontend! • Christine Rose (OCaml Labs) • Isabella Leandersson (OCaml Labs) For the work on the new content and reviewing the existing one! We'd also like to thank the major funders who supported work on revamping the website: grants from the Tezos Foundation and Jane Street facilitated the bulk of the work. Thank you, and if anyone else wishes to help support it on an ongoing basis then donations to the OCaml Software Foundation and grants to the maintenance teams mentioned above are always welcomed. Moving forward, updates on the v3 website will be taken over by @tmattio, who has kindly volunteered to run a community video chat "AMA" about how you can get involved and contribute, and to give your feedback directly. He will post here with more details when timezones are all worked out. We would, of course, be delighted to also use other community channels / podcasts / Twitch / Discords / etc to reach out and get feedback and ideas. On a personal note, it's incredible to see this stream of hard work combine with the recent multicore OCaml merge to provide a modern, welcoming interface to the new users who will appear. I'm most excited about the future of OCaml we are embarking on with 5.0 – thank you to all who have been involved for being such wonderful collaborators. New release of Windows DKML with system compiler and easy Opam switch creation ══════════════════════════════════════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-new-release-of-windows-dkml-with-system-compiler-and-easy-opam-switch-creation/8918/6> jbeckford announced ─────────────────── v0.3.3 has been released. There are no new features for Windows but it does restore the behavior that was present in v0.3.0 (the ANN announcement) but was broken in unannounced versions 0.3.1 and 0.3.2. It also contains a couple bug fixes which help the installation on older Windows machines. Cross-compiling OCaml with GitHub Actions ═════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/cross-compiling-ocaml-with-github-actions/9154/1> jbeckford announced ─────────────────── For those that are interested in cross-compiling, there is: • a [GitHub Actions workflow] with an [example workflow run] that creates an OCaml cross-compiler from: 1. macOS x86_64 host into macOS arm64 target executables (to make universal binaries, for example, on non-Apple Silicon hardware) 2. Linux x86_64 host into Android arm64 (v8) 3. Linux x86_64 host into Android arm32 (v7a) 4. Linux x86_64 host into Android x86_64 • internally there are some patches to the OCaml 4.12.1 source code to create a cross-compiling OCaml compiler • a document I wrote to help me understand what was happening: <https://diskuv.gitlab.io/diskuv-ocaml/doc/CompilingInDepth.html> For example, the GitHub Actions workflow contains a test that illustrates how to use it. When the following is run on 64-bit AMD/Intel Ubuntu Linux: ┌──── │ $ dist/android_arm32v7a-on-linux_x86/opt/mlcross/android_arm32v7a/bin/ocamlopt.opt \ │ hello_world.ml -o hello_world.opt.exe └──── the `hello_world.opt.exe' should run on Android arm32 (v7a): ┌──── │ $ file hello_world.opt.exe │ hello_world.opt.exe: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter │ /system/bin/linker, with debug_info, not stripped └──── This is just a preview and I'm not generating binary packages at the moment. But if it is useful enough to you that you will test it out (ex. copy/paste the GitHub workflow, or do it manually on your mac or Ubuntu machine), please tell me if you have any problems. Be aware it will likely be months before I package it up in a simpler form because it will take time to upstream patches into the OCaml compiler trunk. This is a continuation of the closed topic <https://discuss.ocaml.org/t/cross-compiling-implementations-how-they-work/8686> . Thanks EduardoRFS, Antonio Nuno Monteiro and Romain Beauxis for showing me the technique! [GitHub Actions workflow] <https://gitlab.com/diskuv/diskuv-ocaml/-/blob/main/.github/workflows/cross-unix.yml> [example workflow run] <https://github.com/diskuv/diskuv-ocaml-ghmirror/actions/runs/1703705845> First announcement of Bechamel ══════════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-first-announcement-of-bechamel/9164/1> Calascibetta Romain announced ───────────────────────────── *Bechamel, an agnostic micro-benchmarking tool* I'm glad to announce the release of Bechamel.0.2.0. Bechamel is a framework to do micro-benchmark. As a MirageOS project, the core library does not depends on `Unix' _syscalls_ (hence the term "agnostic"). It provides: • an extensible way to record metrics • different views of results Indeed, we know that it can be difficult to make a béchamel sauce. Adding the milk while adding the flour and mixing it all together requires at least three hands. The observability of the operation is difficult and can therefore, in view of our abilities, interfere with the expected result. This is the reason why Bechamel exists. It allows to make this mixture and ensures that the results are more or less correct. It performs the desired function in a restricted and controlled context in order to remove interference. A touch of machine learning allows us to determine the true outcome of metrics such as time, words allocated in the minor heap or more exotic metrics such as those available via the Linux kernel. Finally, the presentation of the results counts as the presentation of your lasagne. Thus, Bechamel offers several ways to present the results depending on what you want. We can offer you: • An interface in your terminal • A Web 3.0 page which is a full report of your experiment You can see an example of this report [here]. [here] <https://mirage.github.io/bechamel/fact.html> Extensibility of metrics ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ Depending on your runtime context, you can get few metrics from the kernel. For instance, Linux comes with the `perf' tools which is able to record some metrics such as: • the `cpu-clock': this reports the CPU clock, a high-resolution per-CPU timer. • the `page-faults': this reports the number of page faults • etc. They are available via the `bechamel-perf' package which can be linked with your benchmark. You can see a simple example into the distribution: [sqrt.ml] [sqrt.ml] <https://github.com/mirage/bechamel/blob/master/examples/sqrt.ml> The HTML output ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ The HTML + Javascript is pretty simple to generate. Let's say that you have: ┌──── │ let benchmark () : (Bechamel_js.ols_result * Bechamel_js.raws) = │ let ols = Analyze.ols ~bootstrap:0 ~r_square:true ~predictors:Measure.[| run |] in │ let instances = Instance.[ minor_allocated; major_allocated; monotonic_clock ] in │ let cfg = │ Benchmark.cfg ~limit:2000 ~stabilize:true ~quota:(Time.second 0.5) │ ~kde:(Some 1000) () in │ let raw_results = │ Benchmark.all cfg instances │ (Test.make_grouped ~name:"factorial" ~fmt:"%s %s" [ test0; test1 ]) in │ let results = List.map (fun instance -> Analyze.all ols instance raw_results) instances in │ let results = Analyze.merge ols instances results in │ (results, raw_results) └──── You just need to "emit" results into the JSON format: ┌──── │ let compare k0 k1 = │ let a = ref 0 and b = ref 0 in │ Scanf.sscanf k0 "%s %s %d" (fun _ _ a' -> a := a'); │ Scanf.sscanf k1 "%s %s %d" (fun _ _ b' -> b := b'); │ !a - !b │ │ let nothing _ = Ok () │ │ let () = │ let results = benchmark () in │ let results = │ let open Bechamel_js in │ emit ~dst:(Channel stdout) nothing ~compare ~x_label:Measure.run │ ~y_label:(Measure.label Instance.monotonic_clock) │ results in │ match results with Ok () -> () | Error (`Msg err) -> invalid_arg err └──── And a simple intrumentation of `dune' is enough to generate the HTML + Javascript page _via_ `bechamel-html': ┌──── │ (executable │ (name fact) │ (modules fact) │ (public_name bechamel-js.examples.fact) │ (package bechamel-js) │ (libraries bechamel bechamel-js)) │ │ (rule │ (targets fact.json) │ (action │ (with-stdout-to │ %{targets} │ (run ./fact.exe)))) │ │ (rule │ (targets fact.html) │ (mode promote) │ (action │ (system "%{bin:bechamel-html} < %{dep:fact.json} > %{targets}"))) └──── You can see a full example [here]. [here] <https://github.com/mirage/bechamel/blob/master/examples/fact.ml> Kernel Density Estimation ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ The report can show the histogram and/or the KDE of the given distribution of times to check if it's a _normal_ distribution - and ensure that the set given as arguments of our function considers all possibilities. Resources ╌╌╌╌╌╌╌╌╌ The micro-benchmark can be useful to ensure assumptions about _syscalls_. But they can require some resources. In that situation, Bechamel allows the user to define an _allocation_ function which is executed before the benchmark. This resource will be used by your test and will be released then at the end of the benchmark. For instance, Bechamel allows to record metrics for, for instance, [`io_uring']. [`io_uring'] <https://github.com/ocaml-multicore/ocaml-uring> Micro-benchmark, disclaimer ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil – Donald Knuth Micro-benchmark should not be an argument to micro-optimize some parts of your code. Indeed, Bechamel mostly wants to report some observable values and ensure to avoid the Schrödinger's cat case (where the tool affect results by the observation). Bechamel wants to help the developper to _assert_ some assumptions but it should not be an argument to say that your implementation is faster than an other one - at least, it helps you on this way. An Update on the State of the PPX Ecosystem and ppxlib's Transition ═══════════════════════════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/an-update-on-the-state-of-the-ppx-ecosystem-and-ppxlib-s-transition/8200/4> Continuing this thread, Sonja Heinze announced ────────────────────────────────────────────── After some while, we now have a pretty exciting update on this: the `ppx_import' port to ppxlib has been merged. So no need for the "exception"-appendix anymore in the sentence "all packages on that list have been ported with the exception of one". :partying_face: Become an Outreachy Mentor: support the growth and diversity of the OCaml community ═══════════════════════════════════════════════════════════════════════════════════ Archive: <https://discuss.ocaml.org/t/become-an-outreachy-mentor-support-the-growth-and-diversity-of-the-ocaml-community/8213/15> Patrick Ferris announced ──────────────────────── *The call for open-source communities (and mentors for those communities) to participate in the [May 2022 Outreachy round has just started] :tada:* Hopefully the OCaml community will participate again given the success of the first round and the current winter batch. There must be some good OCaml 5 projects people are thinking about ;)) ? By getting the ball rolling nice and early it will hopefully give more time to generate ideas and convince more people to (co-)mentor. Please ask questions, share ideas for projects etc. on this thread. Looking forward to hearing your ideas! [May 2022 Outreachy round has just started] <https://www.outreachy.org/blog/2022-01-10/may-2022-call-for-mentoring-communities/> Cmon 0.1, a printer that shares ═══════════════════════════════ Archive: <https://discuss.ocaml.org/t/ann-cmon-0-1-a-printer-that-shares/9169/1> Frédéric Bour announced ─────────────────────── I am happy to announce that the first version of [Cmon] is available. Cmon stands for "CaMl Object Notation", it is a library for printing values with OCaml syntax. The unusual feature is that the printer represents sharing by introducing let-binders. It tries to put them at "visually pleasing" positions using the ideas described [here]. Printing with let-binders allow handling structures whose serialised representation is exponentially larger than the in-memory one, or where printing wouldn't terminate because of cyclic values. It is convenient to dump the internal state of tools that make use of sharing a lot, a situation that is common in program analysis tools. ┌──── │ # #install_printer Cmon.format;; │ # let rec too_polite = │ lazy Cmon.(cons (string "thank you") (of_lazy too_polite)) │ in Cmon.of_lazy too_polite;; │ - : Cmon.t = let rec v0 = "thank you" :: v0 in │ v0 └──── The actual formatting is handled by [Pprint]. Note that no parser is provided: it is meant only for outputting (with debugging and logging in mind). When used carefully, copy-pasting to an OCaml top-level is enough to recover a value. A few more examples are provided in the [README]. [Cmon] <https://github.com/let-def/cmon> [here] <https://def.lakaban.net/posts/2020-11-14-pretty-printing-with-dominators/> [Pprint] <https://github.com/fpottier/pprint> [README] <https://github.com/let-def/cmon/blob/master/README.md> 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 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 [online]. [Alan Schmitt] [send me a message] <mailto:alan.schm...@polytechnique.org> [the archive] <https://alan.petitepomme.net/cwn/> [RSS feed of the archives] <https://alan.petitepomme.net/cwn/cwn.rss> [online] <http://lists.idyll.org/listinfo/caml-news-weekly/> [Alan Schmitt] <https://alan.petitepomme.net/>
_______________________________________________ caml-news-weekly mailing list caml-news-weekly@lists.idyll.org http://lists.idyll.org/listinfo/caml-news-weekly