Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt <[email protected]> Tue, 23 Jun 2026 12:07:47 +0200
| Newsgroups | gmane.comp.lang.caml.inria |
|---|---|
| Message-ID | <[email protected]> |
--===-=-=
Content-Type: multipart/mixed; boundary="=-=-="
--=-=-=
Content-Type: multipart/alternative; boundary="==-=-="
--==-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl
ZWsgb2YgSnVuZSAxNiB0byAyMywNCjIwMjYuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KRG9jZmQgMTMu
MC4wOiBUVUkgbXVsdGlsaW5lIGZ1enp5IGRvY3VtZW50IGZpbmRlcg0KZ29vZ2xlLWRyaXZlLW9j
YW1sZnVzZSAwLjkuMA0KT0NhbWwgNS41LjAgcmVsZWFzZWQNCk9sZCBDV04NCg0KDQpEb2NmZCAx
My4wLjA6IFRVSSBtdWx0aWxpbmUgZnV6enkgZG9jdW1lbnQgZmluZGVyDQrilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j
YW1sLm9yZy90L2Fubi1kb2NmZC0xMy0wLTAtdHVpLW11bHRpbGluZS1mdXp6eS1kb2N1bWVudC1m
aW5kZXIvMTgyNTkvMT4NCg0KDQpEYXJyZW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBhbGwsIEkgYW0gaGFwcHkgdG8g
YW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgRG9jZmQgMTMuMC4wLg0KDQogIFtSZXBvXSAtIFtPbmxp
bmUgRGVtb10NCg0KICAoVHJ5IHR5cGluZyBgL2xpc3QgZmlsZScgdG8gZ2V0IHN0YXJ0ZWQgaW4g
ZGVtbywgYHgvJyB0byBjbGVhcg0KICBzZWFyY2guIERvY3VtZW50YXRpb24gc3RpbGwgV0lQLikN
Cg0KDQpbUmVwb10gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJyZW5sZGwvZG9jZmQ+DQoNCltPbmxp
bmUgRGVtb10gPGh0dHBzOi8vZGVtby5kb2NmZC5zaC8+DQoNCldoYXQgRG9jZmQgaXMNCuKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoaW5rIGludGVyYWN0aXZl
IGdyZXAgZm9yIHRleHQgZmlsZXMsIFBERnMsIERPQ1hzLCBldGMsIGJ1dA0KICB3b3JkL3Rva2Vu
IGJhc2VkIGluc3RlYWQgb2YgcmVnZXggYW5kIGxpbmUgYmFzZWQsIHNvIHlvdSBjYW4gc2VhcmNo
DQogIGFjcm9zcyBsaW5lcyBlYXNpbHkuDQoNCiAgRG9jZmQgYWltcyB0byBwcm92aWRlIGdvb2Qg
VVggdmlhIGludGVncmF0aW9uIHdpdGggY29tbW9uIHRleHQgZWRpdG9ycw0KICBhbmQgUERGIHZp
ZXdlcnMsIHNvIHlvdSBjYW4ganVtcCBkaXJlY3RseSB0byBhIHNlYXJjaCByZXN1bHQgd2l0aCBh
DQogIHNpbmdsZSBrZXkgcHJlc3MuDQoNCiAgKkludGVyYWN0aXZlIHVzZSoNCg0KICA8aHR0cHM6
Ly9naXRodWIuY29tL2RhcnJlbmxkbC9kb2NmZC9yYXcvbWFpbi9kZW1vLXZocy1naWZzL3JlcG8u
Z2lmPg0KDQogICpOb24taW50ZXJhY3RpdmUgdXNlKg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20v
ZGFycmVubGRsL2RvY2ZkL3Jhdy9tYWluL2RlbW8tdmhzLWdpZnMvcmVwby1ub24taW50ZXJhY3Rp
dmUuZ2lmPg0KDQoNCkZlYXR1cmVzDQrilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIg
TXVsdGl0aHJlYWRlZCBpbmRleGluZyBhbmQgc2VhcmNoaW5nDQogIOKAoiBNdWx0aWxpbmUgZnV6
enkgc2VhcmNoIG9mIG11bHRpcGxlIGZpbGVzDQogIOKAoiBDb250ZW50IHZpZXcgcGFuZSB0aGF0
IHNob3dzIHRoZSBzbmlwcGV0IHN1cnJvdW5kaW5nIHRoZSBzZWFyY2gNCiAgICByZXN1bHQgc2Vs
ZWN0ZWQNCiAg4oCiIFRleHQgZWRpdG9yIGFuZCBQREYgdmlld2VyIGludGVncmF0aW9uDQogIOKA
oiBFZGl0YWJsZSBjb21tYW5kIGhpc3RvcnkgLSByZXdyaXRlL3BsYW4geW91ciBhY3Rpb25zIGlu
IHRleHQgZWRpdG9yDQogIOKAoiBTZWFyY2ggc2NvcGUgbmFycm93aW5nIC0gbGltaXQgc2NvcGUg
b2YgbmV4dCBzZWFyY2ggYmFzZWQgb24gY3VycmVudA0KICAgIHNlYXJjaCByZXN1bHRzDQogIOKA
oiBDbGlwYm9hcmQgaW50ZWdyYXRpb24NCg0KDQpDaGFuZ2VzIHNpbmNlIDExLjAuMA0K4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN
CiAgRG9jZmQgaGFzIGNvbWUgYSBsb25nIHdheSBzaW5jZSBsYXN0IGFubm91bmNlbWVudCBoZXJl
LCBJIHJlY29tbWVuZA0KICBjaGVja2luZyBvdXQgdGhlIFtjaGFuZ2Vsb2ddIGlmIHlvdSdyZSBp
bnRlcmVzdGVkIGluIHRoZSBpbXByb3ZlbWVudHMNCiAgYW5kIG5ldyBmZWF0dXJlcy4NCg0KDQpb
Y2hhbmdlbG9nXSA8aHR0cHM6Ly9naXRodWIuY29tL2RhcnJlbmxkbC9kb2NmZC9ibG9iL21haW4v
Q0hBTkdFTE9HLm1kPg0KDQoNCmdvb2dsZS1kcml2ZS1vY2FtbGZ1c2UgMC45LjANCuKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh
bWwub3JnL3QvYW5uLWdvb2dsZS1kcml2ZS1vY2FtbGZ1c2UtMC05LTAvMTgyNjMvMT4NCg0KDQpB
bGVzc2FuZHJvIFN0cmFkYSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog
IEhpIGV2ZXJ5b25lLA0KDQogIEnigJltIGhhcHB5IHRvIGFubm91bmNlIHRoYXQgYGdvb2dsZS1k
cml2ZS1vY2FtbGZ1c2UnIDAuOS4wIGlzIG5vdw0KICBhdmFpbGFibGUgb24gb3BhbS4NCg0KICBU
aGlzIHJlbGVhc2UgbWlncmF0ZXMgZnJvbSBgbGliZnVzZScgMiB0byBgbGliZnVzZScgMywgYWxs
b3dpbmcgdGhlDQogIHBhY2thZ2UgdG8gYmUgaW5zdGFsbGVkIG9uIG1vZGVybiBMaW51eCBkaXN0
cmlidXRpb25zIHRoYXQgbm8gbG9uZ2VyDQogIHByb3ZpZGUgYGxpYmZ1c2UnIDIuDQoNCiAg4pSM
4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBpbnN0YWxsIGdvb2ds
ZS1kcml2ZS1vY2FtbGZ1c2UNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgUmVwb3NpdG9yaWVzOg0K
DQogIOKAoiBbYGdvb2dsZS1kcml2ZS1vY2FtbGZ1c2UnXQ0KICDigKIgW2BvY2FtbGZ1c2UnXSDi
gJQgT0NhbWwgYmluZGluZ3MgZm9yIGBsaWJmdXNlJw0KDQogIEJlc3QsIEFsZXNzYW5kcm8NCg0K
DQpbYGdvb2dsZS1kcml2ZS1vY2FtbGZ1c2UnXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9hc3RyYWRh
L2dvb2dsZS1kcml2ZS1vY2FtbGZ1c2U+DQoNCltgb2NhbWxmdXNlJ10gPGh0dHBzOi8vZ2l0aHVi
LmNvbS9hc3RyYWRhL29jYW1sZnVzZT4NCg0KDQpPQ2FtbCA1LjUuMCByZWxlYXNlZA0K4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN
CiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC01LTUtMC1yZWxl
YXNlZC8xODI2NS8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGhhdmUgdGhl
IHBsZWFzdXJlIG9mIGNlbGVicmF0aW5nIHRoZSBiaXJ0aGRheSBvZiBCbGFpc2UgUGFzY2FsIGJ5
DQogIGFubm91bmNpbmcgdGhlIHJlbGVhc2Ugb2YgT0NhbWwgdmVyc2lvbiA1LjUuMC4NCg0KICBT
b21lIG9mIHRoZSBoaWdobGlnaHRzIGluIE9DYW1sIDUuNS4wIGFyZToNCg0KDQpNb2R1bGUtZGVw
ZW5kZW50IEZ1bmN0aW9ucw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTW9kdWxlcyBjYW4g
bm93IGJlIHVzZWQgYXMgZnVuY3Rpb24gYXJndW1lbnRzIGluIGEgZm9ybSBvZiBsaWdodHdlaWdo
dA0KICBmdW5jdG9ycy4NCg0KICBGb3IgaW5zdGFuY2UsIHdlIGNhbiBkZWZpbmUgYSBmdW5jdGlv
biBmb3IgcHJpbnRpbmcgYSBtYXAgZ2VuZXJhdGVkIGJ5DQogIHRoZSBgTWFwLk1ha2UnIGZ1bmN0
b3I6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgcHBfbWFwIChtb2R1bGUgTTogTWFw
LlMpIHBwX2tleSBwcF92IHBwZiBzZXQgPQ0KICDilIIgICBpZiBNLmlzX2VtcHR5IHNldCB0aGVu
DQogIOKUgiAgICAgRm9ybWF0LmZwcmludGYgcHBmICLDuCINCiAg4pSCICAgZWxzZQ0KICDilIIg
ICAgbGV0IHBwX3NlcCBwcGYgKCkgPSBGb3JtYXQuZnByaW50ZiBwcGYgIixAICIgaW4NCiAg4pSC
ICAgIGxldCBwcF9iaW5kaW5nIHBwZiAoayx2KSA9DQogIOKUgiAgICAgIEZvcm1hdC5mcHJpbnRm
IHBwZiAiQFslYUAgPUAgJWFAXSIgcHBfa2V5IGsgcHBfdiB2DQogIOKUgiAgICBpbg0KICDilIIg
ICAgRm9ybWF0LmZwcmludGYgcHBmICJAW3tAICVhQCB9QF0iDQogIOKUgiAgICAgIChGb3JtYXQu
cHBfcHJpbnRfc2VxIH5wcF9zZXAgcHBfYmluZGluZykgKE0udG9fc2VxIHNldCkNCiAg4pSU4pSA
4pSA4pSA4pSADQoNCiAgV2UgY2FuIHRoZW4gYXBwbHkgdGhpcyBmdW5jdGlvbiBvbiBhIHN0cmlu
ZyBtYXANCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgU3RyaW5nX21hcCA9IE1hcC5N
YWtlKFN0cmluZykNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdpdGgNCiAg4pSM4pSA4pSA4pSA4pSA
DQogIOKUgiBsZXQgKCkgPQ0KICDilIIgICBsZXQgbSA9IFN0cmluZ19tYXAub2ZfbGlzdCBbIlpl
cm8iLCAiWmVybyI7ICJPbmUiLCAiVW4iXSBpbg0KICDilIIgICBsZXQgcHBfc3RyID0gRm9ybWF0
LnBwX3ByaW50X3N0cmluZyBpbg0KICDilIIgICBGb3JtYXQucHJpbnRmICIlYUAuIg0KICDilIIg
ICAocHBfbWFwIChtb2R1bGUgU3RyaW5nX21hcCkgcHBfc3RyIHBwX3N0cikgbQ0KICDilJTilIDi
lIDilIDilIANCg0KICBDb21wYXJlZCB0byBmaXJzdC1jbGFzcyBtb2R1bGVzLCB0aGUgdHlwZSBv
ZiB0aGUgZnVuY3Rpb24gYHBwX21hcCcNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB0eXBlICdh
IHByaW50ZXIgPSBGb3JtYXQuZm9ybWF0dGVyIC0+ICdhIC0+IHVuaXQNCiAg4pSCIHZhbCBwcF9t
YXA6IChtb2R1bGUgTTogTWFwLlMpIC0+IE0ua2V5IHByaW50ZXIgLT4gJ2EgcHJpbnRlciAtPiAn
YSBNLnQgcHJpbnRlcg0KICDilJTilIDilIDilIDilIANCiAgaXMgZGVwZW5kZW50IG92ZXIgdGhl
IHZhbHVlIG9mIHRoZSBtb2R1bGUgYFMnLCBhbmQgdGh1cyB0aGUgZnVuY3Rpb24NCiAgY2FuIG9u
bHkgYXBwbGllZCBvdmVyIGEgc3RhdGljYWxseSBrbm93biBtb2R1bGU6DQogIOKUjOKUgOKUgOKU
gOKUgA0KICDilIIgbGV0IGYgKCk6IChtb2R1bGUgTWFwLlMpID0NCiAg4pSCICAgaWYgUmFuZG9t
LmJvb2wgKCkgdGhlbg0KICDilIIgICAgIChtb2R1bGUgTWFwLk1ha2UoSW50KSkNCiAg4pSCICAg
ZWxzZQ0KICDilIIgICAgIChtb2R1bGUgTWFwLk1ha2UoRmxvYXQpKQ0KICDilIIgbGV0IGZhaWwg
PSBwcF9tYXAgKGYgKCkpDQogIOKUlOKUgOKUgOKUgOKUgA0KICDilIzilIDilIDilIDilIANCiAg
4pSCICBFcnJvcjogVGhpcyBleHByZXNzaW9uIGhhcyB0eXBlDQogIOKUgiAgICAgICAgICAobW9k
dWxlIE0gOiBNYXAuUykgLT4NCiAg4pSCICAgICAgICAgIChGb3JtYXQuZm9ybWF0dGVyIC0+IE0u
a2V5IC0+IHVuaXQpIC0+DQogIOKUgiAgICAgICAgICAoRm9ybWF0LmZvcm1hdHRlciAtPiAnYSAt
PiB1bml0KSAtPiBGb3JtYXQuZm9ybWF0dGVyIC0+ICdhIE0udCAtPiB1bml0DQogIOKUgiAgICAg
ICAgYnV0IGFuIGV4cHJlc3Npb24gd2FzIGV4cGVjdGVkIG9mIHR5cGUgKG1vZHVsZSBNYXAuUykg
LT4gJ2INCiAg4pSCICAgICAgICBUaGUgbW9kdWxlIE0gd291bGQgZXNjYXBlIGl0cyBzY29wZQ0K
ICDilIIgVGhpcyBmdW5jdGlvbiBpcyBtb2R1bGUtZGVwZW5kZW50LiBUaGUgZGVwZW5kZW5jeSBp
cyBwcmVzZXJ2ZWQNCiAg4pSCIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIHN0YXRpYyBt
b2R1bGUgYXJndW1lbnQgKG1vZHVsZSBNIDogUykNCiAg4pSCIG9yIChtb2R1bGUgTSkuIEl0cyBh
cmd1bWVudCBoZXJlIGlzIG5vdCBzdGF0aWMsIHNvIHRoZSB0eXBlLWNoZWNrZXINCiAg4pSCIHRy
aWVkIGluc3RlYWQgdG8gY2hhbmdlIHRoZSBmdW5jdGlvbiB0eXBlIHRvIGJlIG5vbi1kZXBlbmRl
bnQuDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNClJlbG9jYXRhYmxlIENvbXBpbGVyDQrilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K
ICBBIGNvbXBpbGVyIGluc3RhbGxhdGlvbiBjYW4gbm93IGJlIG1vdmVkIG9yIGNvcGllZCB3aXRo
IG5vIHJpc2sgb2YNCiAgaGFyZC10by1kZWJ1ZyBlcnJvcnMgZHVlIHRvIG1peGluZyBpbmNvbXBh
dGlibGUgYnl0ZWNvZGUgcnVudGltZQ0KICBpbnRlcnByZXRlcnMuDQoNCiAgSW4gcHJhY3RpY2Us
IHRoaXMgbWVhbnMgdGhhdCBjcmVhdGluZyBhIGxvY2FsIHN3aXRjaCB3aGVuIHRoZXJlIGlzIGEN
CiAgZ2xvYmFsIHN3aXRjaCB3aXRoIHRoZSBzYW1lIGNvbXBpbGVyIHZlcnNpb24gYW5kIGNvbmZp
Z3VyYXRpb24NCiAgYXZhaWxhYmxlIGNhbiBiZSBkb25lIGJ5IGNsb25pbmcgdGhlIGdsb2JhbCBz
d2l0Y2ggcmF0aGVyIHRoYW4NCiAgcmVjb21waWxpbmcgdGhlIHdob2xlIGNvbXBpbGVyLg0KDQog
IFRoaXMgc2hvdWxkIGNvbnNpZGVyYWJseSByZWR1Y2UgdGhlIHRpbWUgcmVxdWlyZWQgdG8gY3Jl
YXRlIG5ldyBsb2NhbA0KICBvcGFtIHN3aXRjaGVzIG91dC1vZi10aGUtYm94Lg0KDQoNClBvbHlt
b3JwaGljIEZ1bmN0aW9ucyBhcyBGdW5jdGlvbiBBcmd1bWVudHMNCuKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K
DQogIEhpZ2hlci1yYW5rIHBvbHltb3JwaGljIGZ1bmN0aW9ucyBjYW4gbm93IGJlIGRlZmluZWQg
ZGlyZWN0bHkgYnkgdXNpbmcNCiAgYW4gZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uIGluIGEgZnVu
Y3Rpb24gYXJndW1lbnQNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBhcHBseV9tYXAg
KG1hcDogJ2EgJ2IuICgnYSAtPiAnYikgLT4gJ2EgbGlzdCAtPiAnYiBsaXN0KSA9DQogIOKUgiAg
IG1hcCBzdHJpbmdfb2ZfaW50IFsxOzI7M10sIG1hcCBMaXN0LnNpbmdsZXRvbiBbIngiOyAieSJd
DQogIOKUgiBsZXQgXyA9IGFwcGx5X21hcCBMaXN0Lm1hcA0KICDilJTilIDilIDilIDilIANCg0K
ICBQcmV2aW91c2x5IGRlZmluaW5nIHN1Y2ggYSBmdW5jdGlvbiByZXF1aXJlZCBnb2luZyB0aHJv
dWdoIGVpdGhlciBhDQogIHJlY29yZCBvciBhbiBvYmplY3Qgd2l0aCBhIHBvbHltb3JwaGljIGZp
ZWxkIG9yIG1ldGhvZHMNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUgbWFwID0geyBt
YXA6ICdhICdiLiAoJ2EgLT4gJ2IpIC0+ICdhIGxpc3QgLT4gJ2IgbGlzdCB9DQogIOKUgiBsZXQg
YXBwbHlfbWFwIHttYXB9ID0NCiAg4pSCICAgbWFwIHN0cmluZ19vZl9pbnQgWzE7MjszXSwgbWFw
IExpc3Quc2luZ2xldG9uIFsieCI7ICJ5Il0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KU2VhcmNo
IGFuZCBSZXBsYWNlIFN1YnN0cmluZyBGdW5jdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBgU3RyaW5nJyBtb2R1
bGUgaGFzIGJlZW4gZXh0ZW5kZWQgd2l0aCBtYW55IGZ1bmN0aW9ucyBmb3INCiAgc2VhcmNoaW5n
IGFuZCByZXBsYWNpbmcgc3Vic3RyaW5ncyBpbnNpZGUgYSBzdHJpbmcuDQoNCiAg4pSM4pSA4pSA
4pSA4pSADQogIOKUgiBsZXQgX3RydWUgPSBTdHJpbmcuaW5jbHVkZXMgfmFmZml4OiJhYmEiICJh
YmJhYmEiDQogIOKUgiBsZXQgc2VudGVuY2UgPSBTdHJpbmcucmVwbGFjZV9hbGwgfnN1Yjoi8J2E
vSIgfmJ5OiJ3b3JkIiAiQSDwnYS9IGlzIHJl8J2EvWVkIg0KICDilJTilIDilIDilIDilIANCg0K
ICBUaGUgc3Vic3RyaW5nIHNlYXJjaCBpcyB1c2luZyB0aGUgMi13YXkgc3RyaW5nIG1hdGNoaW5n
IGFsZ29yaXRobQ0KICB3aGljaCBoYXMgdGhlIGFkdmFudGFnZSBvZiByZXF1aXJpbmcgY29uc3Rh
bnQgc3BhY2UgbWVtb3J5IG92ZXJoZWFkDQogIGluZGVwZW5kZW50bHkgb2YgdGhlIG5lZWRsZSBz
aXplLg0KDQoNCkdlbmVyYWxpc2VkIExvY2FsIERlZmluaXRpb25zDQrilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYwNCg0KICBJdCBpcyBub3cgYWx3YXlzIHBvc3NpYmxlIHRvIGRlZmluZSBs
b2NhbGx5IGEgdHlwZSwgYSBjbGFzcywgYSBtb2R1bGUNCiAgdHlwZSBvciBhbnkga2luZCBvZiBp
dGVtIHRoYXQgY2FuIGJlIGRlZmluZWQgZ2xvYmFsbHk6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQog
IOKUgiBsZXQgbWFuZGVsYnJvdCBuIHggPQ0KICDilIIgICBsZXQgdHlwZSB0ID0gQ29udmVyZ2Ug
fCBFc2NhcGUgb2YgaW50IGluDQogIOKUgiAgIC4uLg0KICDilIIgICBtYXRjaCBvcmJpdCBuIHgg
d2l0aA0KICDilIIgICB8IENvbnZlcmdlIC0+IDANCiAg4pSCICAgfCBFeGl0X2F0IG4gLT4gY29s
b3JpemUgbg0KICDilJTilIDilIDilIDilIANCg0KDQpFeHRlcm5hbCBUeXBlcw0K4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgV2hlbiBpbnRlcmZhY2luZyB3
aXRoIGZvcmVpZ24gZnVuY3Rpb24gbGlicmFyaWVzLCBpdCBpcyBub3cgcG9zc2libGUNCiAgdG8g
ZGVmaW5lIGV4dGVybmFsIHR5cGUNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUgaW50
X2dtcCA9IGV4dGVybmFsICJtcHpfdCINCiAg4pSCIHR5cGUgZmxvYXRfZ21wID0gZXh0ZXJuYWwg
Im1wZl90Ig0KICDilJTilIDilIDilIDilIANCg0KICBDb21wYXJlZCB0byBhbiBhYnN0cmFjdCB0
eXBlIGRlZmluaXRpb24sIHRoZSBleHRlcm5hbCB0eXBlIG5hbWUNCiAgIm1wel90IiAocmVzcC4g
YG1wZl90JykgbWFrZXMgdGhlIHR5cGUgZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW55DQogIG5vbi1h
YnN0cmFjdCB0eXBlcyBvciBleHRlcm5hbCB0eXBlcyB3aXRoIGEgZGlmZmVyZW50IG5hbWUuDQoN
CiAgSW4gcGFydGljdWxhciwgdGhpcyBtYWtlcyBGRkkgdHlwZXMgYmV0dGVyIGJlaGF2ZWQgd2hl
biBjb21iaW5lZCB3aXRoDQogIEdlbmVyYWxpc2VkIEFic3RyYWN0IERhdGEgVHlwZXMgKEdBRFRz
KS4gRm9yIGluc3RhbmNlLCBUaGUgdHlwZWNoZWNrZXINCiAgaXMgYWJsZSB0byBwcm92ZSB0aGF0
DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgb2s6IChpbnRfZ21wLFtgIEFdICkgVHlw
ZS5lcSAtPiBfID0gZnVuY3Rpb24gXyAtPiAuDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGlzIGEg
dG90YWwgZnVuY3Rpb24gYmVjYXVzZSB0aGUgZXh0ZXJuYWwgdHlwZSBgaW50X2dtcCcgaXMgbm90
DQogIGNvbXBhdGlibGUgd2l0aCBhIHBvbHltb3JwaGljIHZhcmlhbnQgdHlwZS4NCg0KDQpXYXJu
aW5nOiBBYnN0cmFjdCB0eXBlcyBpbiB0aGUgY3VycmVudCBtb2R1bGUNCuKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjA0KDQogIFRoZSBhc3R1dGUgcmVhZGVyIGhhcyBwcm9iYWJseSBub3RpY2VkIGluIHRo
ZSBkZWZpbml0aW9uIGFib3ZlIHRoYXQsDQogIGluIE9DYW1sIDUuNC4wLCB0aGUgdHlwZWNoZWNr
ZXIgZG9lcyBhY2NlcHQNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUgaW50X2dtcA0K
ICDilIIgbGV0IG9rOiAoaW50X2dtcCwgW2AgQV0gKSBUeXBlLmVxIC0+IF8gPSBmdW5jdGlvbiBf
IC0+IC4NCiAg4pSU4pSA4pSA4pSA4pSADQogIGFzIHRvdGFsLg0KDQogIEluZGVlZCB1bnRpbCBP
Q2FtbCA1LjUuMCwgYWJzdHJhY3QgdHlwZXMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtb2R1bGUN
CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB0eXBlIGENCiAg4pSCIHR5cGUgYg0KICDilJTilIDi
lIDilIDilIANCg0KICB3ZXJlIGNvbnNpZGVyZWQgYXMgdW5pcXVlIGFuZCBwcm92YWJseSBkaWZm
ZXJlbnQNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBmOiAneC4gKGEsYikgVHlwZS5l
cSAtPiAneCA9IGZ1bmN0aW9uIF8gLT4gLg0KICDilJTilIDilIDilIDilIANCg0KICBIb3dldmVy
LCB0aGlzIHNwZWNpYWwgcnVsZSBmb3IgbG9jYWwgZGVmaW5pdGlvbiBvZiBhYnN0cmFjdCB0eXBl
cyB3YXMNCiAgdmVyeSBicml0dGxlLiBBcyBzb29uIGFzIG9uZSBtb3ZlZCBvdXRzaWRlIG9mIHRo
ZSBjdXJyZW50IG1vZHVsZSwgaXQNCiAgd2FzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBwcm92ZSB0
aGF0IHRoZSB0eXBlcyB3ZXJlIGRpZmZlcmVudC4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSC
IG1vZHVsZSBNID0gc3RydWN0DQogIOKUgiAgIHR5cGUgYQ0KICDilIIgICB0eXBlIGINCiAg4pSC
IGVuZA0KICDilIIgbGV0IGZhaWw6ICd4LiAoTS5hLE0uYikgVHlwZS5lcSAtPiAneCA9IGZ1bmN0
aW9uIF8gLT4gLg0KICDilJTilIDilIDilIDilIANCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBF
cnJvcjogVGhpcyBtYXRjaCBjYXNlIGNvdWxkIG5vdCBiZSByZWZ1dGVkLg0KICDilIIgICAgICAg
IEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHZhbHVlIHRoYXQgd291bGQgcmVhY2ggaXQ6IEVxdWFs
DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgc3BlY2lhbCB0eXBlY2hlY2tpbmcgcnVsZSBo
YXMgYmVlbiByZW1vdmVkIGluIE9DYW1sIDUuNS4wLiBJZiB5b3UNCiAgd2VyZSByZWx5aW5nIG9u
IGl0LCBmb3IgaW5zdGFuY2UsIGJlY2F1c2UgeW91IHVzZWQgYW4gYWJzdHJhY3QgdHlwZSBhcw0K
ICB0eXBlLWxldmVsIGxhYmVsIGluIGEgR0FEVHMsIHlvdSBjYW4gY2hhbmdlIHlvdXIgYWJzdHJh
Y3QgdHlwZQ0KICBkZWZpbml0aW9uIHRvIGEgcG9zc2libHkgcHJpdmF0ZSBhYmJyZXZpYXRpb24g
b2YgYSBwb2x5bW9ycGhpYyB2YXJpYW50DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB0eXBl
IGEgPSBwcml2YXRlIFtgQV0NCiAg4pSCIHR5cGUgYiA9IFtgQl0NCiAg4pSU4pSA4pSA4pSA4pSA
DQogIG9yIGEgKHBvc3NpYmx5IHByaXZhdGUpIHN1bSB0eXBlDQoNCiAg4pSM4pSA4pSA4pSA4pSA
DQogIOKUgiB0eXBlIGEgPSBBDQogIOKUgiB0eXBlIGIgPSBwcml2YXRlIEINCiAg4pSU4pSA4pSA
4pSA4pSADQoNCiAgSWYgeW91IHdlcmUgdXNpbmcgYW4gYWJzdHJhY3QgdHlwZSBhcyBib3RoIGEg
dHlwZS1sZXZlbCBsYWJlbCBhbmQgYQ0KICBGRkkgdHlwZSwgeW91IGNhbiBub3cgdXNlIGFuIGV4
dGVybmFsIHR5cGUgZGVmaW5pdGlvbiB3aGljaCB3aWxsIGdpdmUNCiAgeW91IGEgcHJvdmFibHkg
ZGlzdGluY3QgdHlwZSBldmVuIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgbW9kdWxlLg0KDQoNCkdD
IGltcHJvdmVtZW50cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWMDQoNCiAgU29tZSBvZiB0aGUgb25nb2luZyB3b3JrIHRvIGltcHJvdmUgdGhlIHBhY2luZyBv
ZiB0aGUgZ2FyYmFnZQ0KICBjb2xsZWN0b3IgaGFzIGJlZW4gaW50ZWdyYXRlZCBpbiBPQ2FtbCA1
LjUuMCwgdHdvIG9mIHRoZSBpbXBvcnRhbnQNCiAgY2hhbmdlcyBpbiBPQ2FtbCA1LjUgR0MgYXJl
DQoNCiAg4oCiIHRoZSBhZGRpdGlvbiBvZiBhIHN3ZWVwLW9ubHkgcGhhc2UgYXQgdGhlIHN0YXJ0
IG9mIG1ham9yIEdDDQogIOKAoiB0aGUgYWRkaXRpb24gb2YgYW4gaWRsZSBwaGFzZSB0byBzbW9v
dGggdGhlIGJlaGF2aW91ciBvZiB0aGUgR0MgYXQNCiAgICB0aGUgc3RhcnQuDQoNCg0KTWFueSBp
bmNyZW1lbnRhbCBjaGFuZ2VzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgVGhlIFdpbmRvd3Mg
aW1wbGVtZW50YXRpb24gaXMgbm8gbW9yZSByZWxpYW50IG9uIFdpbnB0aHJlYWRzDQogIOKAoiBB
cm91bmQgNjAgbmV3IHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zDQogIOKAoiBBcm91bmQgOTAg
dmFyaW91cyBpbXByb3ZlbWVudHMNCiAg4oCiIEEgZG96ZW4gb2YgZG9jdW1lbnRhdGlvbiB1cGRh
dGVzDQogIOKAoiBBcm91bmQgNDAgYnVnIGZpeGVzDQoNCiAgUGxlYXNlIHJlcG9ydCBhbnkgdW5l
eHBlY3RlZCBiZWhhdmlvdXJzIG9uIHRoZSBbT0NhbWwgaXNzdWUgdHJhY2tlcl0NCiAgYW5kIHBv
c3QgYW55IHF1ZXN0aW9ucyBvciBjb21tZW50cyB5b3UgbWlnaHQgaGF2ZSBvbiBvdXIgW2Rpc2N1
c3Npb24NCiAgZm9ydW1zXS4NCg0KICBUaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgY2FuIGJlIGZv
dW5kIGluIHRoZSBmdWxsIGNoYW5nZWxvZy4NCg0KICBIYXBweSBoYWNraW5nLCBGbG9yaWFuIEFu
Z2VsZXR0aSBmb3IgdGhlIE9DYW1sIHRlYW0uDQoNCiAg4oCUDQoNCg0KW09DYW1sIGlzc3VlIHRy
YWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzPg0KDQpbZGlzY3Vz
c2lvbiBmb3J1bXNdIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnPg0KDQoNCkluc3RhbGxhdGlv
biBJbnN0cnVjdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBiYXNlIGNvbXBpbGVy
IGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gb3BhbSBzd2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5n
IGNvbW1hbmRzOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSC
IG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjUuMA0KICDilJTilIDilIDilIDilIANCg0KICBUaGUgc291
cmNlIGNvZGUgZm9yIHRoZSByZWxlYXNlIGlzIGFsc28gZGlyZWN0bHkgYXZhaWxhYmxlIG9uOg0K
DQogIOKAoiBbR2l0SHViXQ0KICDigKIgW09DYW1sIGFyY2hpdmVzIGF0IElucmlhXQ0KDQoNCltH
aXRIdWJdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3JlbGVhc2VzL2Rvd25sb2Fk
LzUuNS4wL29jYW1sLTUuNS4wLnRhci5nej4NCg0KW09DYW1sIGFyY2hpdmVzIGF0IElucmlhXQ0K
PGh0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC01LjUvb2NhbWwtNS41LjAu
dGFyLmd6Pg0KDQril4ogRmluZS1UdW5lZCBDb21waWxlciBDb25maWd1cmF0aW9uDQoNCiAgSWYg
eW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBpbGVyLCB5b3Ug
Y2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCg0KICDilIzilIDilIDi
lIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgPHN3aXRj
aF9uYW1lPiBvY2FtbC12YXJpYW50cy41LjUuMCtvcHRpb25zIDxvcHRpb25fbGlzdD4NCiAg4pSU
4pSA4pSA4pSA4pSADQoNCiAgd2hlcmUgYDxvcHRpb25fbGlzdD4nIGlzIGEgc3BhY2Ugc2VwYXJh
dGVkIGxpc3Qgb2YgYG9jYW1sLW9wdGlvbi0qJw0KICBwYWNrYWdlcy4gRm9yIGluc3RhbmNlLCBm
b3IgYSBgZmxhbWJkYScgYW5kIGBuby1mbGF0LWZsb2F0LWFycmF5Jw0KICBzd2l0Y2g6DQoNCiAg
4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgNS41LjArZmxhbWJkYStu
ZmZhIG9jYW1sLXZhcmlhbnRzLjUuNS4wK29wdGlvbnMgb2NhbWwtb3B0aW9uLWZsYW1iZGEgb2Nh
bWwtb3B0aW9uLW5vLWZsYXQtZmxvYXQtYXJyYXkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgL0Vk
aXRvcuKAmXMgbm90ZTogcGxlYXNlIHJlYWQgdGhlIHBvc3QgZm9yIHRoZSBmdWxsIGNoYW5nZWxv
Zy4vDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBl
biB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFp
bA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhl
IFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8g
cmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRo
ZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2Fn
ZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2
ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRo
ZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoN
CltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0
Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg==
--==-=-=
Content-Type: text/html; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en" xml:lang=3D"en">
<head>
<!-- 2026-06-23 Tue 12:06 -->
<meta http-equiv=3D"Content-Type" content=3D"text/html;charset=3Dutf-8" />
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=3D1"=
/>
<title>OCaml Weekly News</title>
<meta name=3D"generator" content=3D"Org Mode" />
<style type=3D"text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-c:before { content: 'C'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'JavaScript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr {
font-size: smaller;
@supports (content: attr(data-linenr)) {
visibility: hidden;
&::before { content: attr(data-linenr); visibility: visible; }
}
}
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<style type=3D"text/css">#table-of-contents h2 { display: none } .title { d=
isplay: none } .authorname { text-align: right }</style>
<style type=3D"text/css">.outline-2 {border-top: 1px solid black;}</style>
</head>
<body>
<div id=3D"content" class=3D"content">
<h1 class=3D"title">OCaml Weekly News</h1>
<p>
<a href=3D"https://alan.petitepomme.net/cwn/2026.06.16.html">Previous Week<=
/a> <a href=3D"https://alan.petitepomme.net/cwn/index.html">Up</a> <a href=
=3D"https://alan.petitepomme.net/cwn/2026.06.30.html">Next Week</a>
</p>
<p>
Hello
</p>
<p>
Here is the latest OCaml Weekly News, for the week of June 16 to 23, 2026.
</p>
<div id=3D"table-of-contents" role=3D"doc-toc">
<h2>Table of Contents</h2>
<div id=3D"text-table-of-contents" role=3D"doc-toc">
<ul>
<li><a href=3D"#1">Docfd 13.0.0: TUI multiline fuzzy document finder</a></l=
i>
<li><a href=3D"#2">google-drive-ocamlfuse 0.9.0</a></li>
<li><a href=3D"#3">OCaml 5.5.0 released</a></li>
<li><a href=3D"#org22075c1">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Docfd 13.0.0: TUI multiline fuzzy document finder</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-docfd-13-0-0-tui-multil=
ine-fuzzy-document-finder/18259/1">https://discuss.ocaml.org/t/ann-docfd-13=
-0-0-tui-multiline-fuzzy-document-finder/18259/1</a>
</p>
</div>
<div id=3D"outline-container-org3c7013f" class=3D"outline-3">
<h3 id=3D"org3c7013f">Darren announced</h3>
<div class=3D"outline-text-3" id=3D"text-org3c7013f">
<p>
Hi all, I am happy to announce the release of Docfd 13.0.0.
</p>
<p>
<a href=3D"https://github.com/darrenldl/docfd">Repo</a> - <a href=3D"https:=
//demo.docfd.sh/">Online Demo</a>
</p>
<p>
(Try typing <code>/list file</code> to get started in demo, <code>x/</code>=
to clear search. Documentation still WIP.)
</p>
</div>
<div id=3D"outline-container-orgfbfa37e" class=3D"outline-4">
<h4 id=3D"orgfbfa37e">What Docfd is</h4>
<div class=3D"outline-text-4" id=3D"text-orgfbfa37e">
<p>
Think interactive grep for text files, PDFs, DOCXs, etc, but word/token bas=
ed instead of regex and line based, so you can search across lines easily.
</p>
<p>
Docfd aims to provide good UX via integration with common text editors and =
PDF viewers, so you can jump directly to a search result with a single key =
press.
</p>
<p>
<b>Interactive use</b>
</p>
<div id=3D"org010f372" class=3D"figure">
<p><img src=3D"https://github.com/darrenldl/docfd/raw/main/demo-vhs-gifs/re=
po.gif" alt=3D"repo.gif" width=3D"80%" />
</p>
</div>
<p>
<b>Non-interactive use</b>
</p>
<div id=3D"org61e62ab" class=3D"figure">
<p><img src=3D"https://github.com/darrenldl/docfd/raw/main/demo-vhs-gifs/re=
po-non-interactive.gif" alt=3D"repo-non-interactive.gif" width=3D"80%" />
</p>
</div>
</div>
</div>
<div id=3D"outline-container-orgb25477e" class=3D"outline-4">
<h4 id=3D"orgb25477e">Features</h4>
<div class=3D"outline-text-4" id=3D"text-orgb25477e">
<ul class=3D"org-ul">
<li>Multithreaded indexing and searching</li>
<li>Multiline fuzzy search of multiple files</li>
<li>Content view pane that shows the snippet surrounding the search result =
selected</li>
<li>Text editor and PDF viewer integration</li>
<li>Editable command history - rewrite/plan your actions in text editor</li>
<li>Search scope narrowing - limit scope of next search based on current se=
arch results</li>
<li>Clipboard integration</li>
</ul>
</div>
</div>
<div id=3D"outline-container-org3a71503" class=3D"outline-4">
<h4 id=3D"org3a71503">Changes since 11.0.0</h4>
<div class=3D"outline-text-4" id=3D"text-org3a71503">
<p>
Docfd has come a long way since last announcement here, I recommend checkin=
g out the <a href=3D"https://github.com/darrenldl/docfd/blob/main/CHANGELOG=
.md">changelog</a> if you're interested in the improvements and new feature=
s.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">google-drive-ocamlfuse 0.9.0</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-google-drive-ocamlfuse-=
0-9-0/18263/1">https://discuss.ocaml.org/t/ann-google-drive-ocamlfuse-0-9-0=
/18263/1</a>
</p>
</div>
<div id=3D"outline-container-org2af621b" class=3D"outline-3">
<h3 id=3D"org2af621b">Alessandro Strada announced</h3>
<div class=3D"outline-text-3" id=3D"text-org2af621b">
<p>
Hi everyone,
</p>
<p>
I=E2=80=99m happy to announce that <code>google-drive-ocamlfuse</code> 0.9.=
0 is now available on opam.
</p>
<p>
This release migrates from <code>libfuse</code> 2 to <code>libfuse</code> 3=
, allowing the package to be installed on modern Linux distributions that n=
o longer provide <code>libfuse</code> 2.
</p>
<pre class=3D"example" id=3D"org8d22827">
opam update
opam install google-drive-ocamlfuse
</pre>
<p>
Repositories:
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/astrada/google-drive-ocamlfuse"><code>goo=
gle-drive-ocamlfuse</code></a></li>
<li><a href=3D"https://github.com/astrada/ocamlfuse"><code>ocamlfuse</code>=
</a> =E2=80=94 OCaml bindings for <code>libfuse</code></li>
</ul>
<p>
Best,
Alessandro
</p>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">OCaml 5.5.0 released</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ocaml-5-5-0-released/18265/=
1">https://discuss.ocaml.org/t/ocaml-5-5-0-released/18265/1</a>
</p>
</div>
<div id=3D"outline-container-orga201c41" class=3D"outline-3">
<h3 id=3D"orga201c41">octachron announced</h3>
<div class=3D"outline-text-3" id=3D"text-orga201c41">
<p>
We have the pleasure of celebrating the birthday of Blaise Pascal by announ=
cing the release of OCaml version 5.5.0.
</p>
<p>
Some of the highlights in OCaml 5.5.0 are:
</p>
</div>
<div id=3D"outline-container-orgb96a426" class=3D"outline-4">
<h4 id=3D"orgb96a426">Module-dependent Functions</h4>
<div class=3D"outline-text-4" id=3D"text-orgb96a426">
<p>
Modules can now be used as function arguments in a form of lightweight func=
tors.
</p>
<p>
For instance, we can define a function for printing a map generated by
the <code>Map.Make</code> functor:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">pp_map</span> (<span =
style=3D"color: #006f00; font-weight: bold;">module</span> <span style=3D"c=
olor: #557400; font-weight: bold;">M</span>: <span style=3D"color: #557400;=
font-weight: bold;">Map.S</span>) <span style=3D"color: #007a9f;">pp_key</=
span> <span style=3D"color: #007a9f;">pp_v</span> <span style=3D"color: #00=
7a9f;">ppf</span> <span style=3D"color: #007a9f;">set</span> =3D
<span style=3D"color: #006f00; font-weight: bold;">if</span> <span style=
=3D"color: #557400; font-weight: bold;">M.</span>is_empty set <span style=
=3D"color: #006f00; font-weight: bold;">then</span>
<span style=3D"color: #557400; font-weight: bold;">Format.</span>fprint=
f ppf <span style=3D"color: #ca3400;">"ø"</span>
<span style=3D"color: #006f00; font-weight: bold;">else</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span styl=
e=3D"color: #a7601f;">pp_sep</span> <span style=3D"color: #007a9f;">ppf</sp=
an> () =3D <span style=3D"color: #557400; font-weight: bold;">Format.</span=
>fprintf ppf <span style=3D"color: #ca3400;">",@ "</span> <span style=3D"co=
lor: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span styl=
e=3D"color: #a7601f;">pp_binding</span> <span style=3D"color: #007a9f;">ppf=
</span> (<span style=3D"color: #007a9f;">k</span>,<span style=3D"color: #00=
7a9f;">v</span>) =3D
<span style=3D"color: #557400; font-weight: bold;">Format.</span>fprin=
tf ppf <span style=3D"color: #ca3400;">"@[%a@ =3D@ %a@]"</span> pp_key k pp=
_v v
<span style=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #557400; font-weight: bold;">Format.</span>fprintf=
ppf <span style=3D"color: #ca3400;">"@[{@ %a@ }@]"</span>
(<span style=3D"color: #557400; font-weight: bold;">Format.</span>pp_p=
rint_seq ~pp_sep pp_binding) (<span style=3D"color: #557400; font-weight: b=
old;">M.</span>to_seq set)
</code></pre>
</div>
<p>
We can then apply this function on a string map
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">module</span> <span style=3D"color: #557400; font-weight: bold;"=
>String_map</span> =3D <span style=3D"color: #557400; font-weight: bold;">M=
ap.Make(String)</span>
</code></pre>
</div>
<p>
with
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> () =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">m</span> =3D <span style=3D"color: #557400; font-weigh=
t: bold;">String_map.</span>of_list [<span style=3D"color: #ca3400;">"Zero"=
</span>, <span style=3D"color: #ca3400;">"Zero"</span>; <span style=3D"colo=
r: #ca3400;">"One"</span>, <span style=3D"color: #ca3400;">"Un"</span>] <sp=
an style=3D"color: #242521; font-weight: bold;">in</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">pp_str</span> =3D <span style=3D"color: #557400; font-=
weight: bold;">Format.</span>pp_print_string <span style=3D"color: #242521;=
font-weight: bold;">in</span>
<span style=3D"color: #557400; font-weight: bold;">Format.</span>printf <=
span style=3D"color: #ca3400;">"%a@."</span>
(pp_map (<span style=3D"color: #006f00; font-weight: bold;">module</span>=
<span style=3D"color: #557400; font-weight: bold;">String_map</span>) pp_s=
tr pp_str) m
</code></pre>
</div>
<p>
Compared to first-class modules, the type of the function <code>pp_map</cod=
e>
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">type</span> <span style=3D"color: #444fcf; font-weight: bold;">'=
a printer</span> =3D <span style=3D"color: #557400; font-weight: bold;">For=
mat.</span>formatter -> 'a -> unit
<span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">pp_map</span>: (<span style=3D"color: #006f00; font-we=
ight: bold;">module</span> <span style=3D"color: #557400; font-weight: bold=
;">M</span>: <span style=3D"color: #557400; font-weight: bold;">Map.S</span=
>) -> <span style=3D"color: #557400; font-weight: bold;">M.</span>key pr=
inter -> 'a printer -> 'a <span style=3D"color: #557400; font-weight:=
bold;">M.</span>t printer
</code></pre>
</div>
<p>
is dependent over the value of the module <code>S</code>, and thus the func=
tion can only
applied over a statically known module:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">f</span> ():<span sty=
le=3D"color: #444fcf; font-weight: bold;"> (</span><span style=3D"color: #0=
06f00; font-weight: bold;">module</span><span style=3D"color: #444fcf; font=
-weight: bold;"> </span><span style=3D"color: #557400; font-weight: bold;">=
Map.S</span><span style=3D"color: #444fcf; font-weight: bold;">) </span>=3D
<span style=3D"color: #006f00; font-weight: bold;">if</span> <span style=
=3D"color: #557400; font-weight: bold;">Random.</span>bool () <span style=
=3D"color: #006f00; font-weight: bold;">then</span>
(<span style=3D"color: #242521; font-weight: bold;">module</span> <span=
style=3D"color: #557400; font-weight: bold;">Map</span>.<span style=3D"col=
or: #242521;">Make</span>(<span style=3D"color: #242521;">Int</span>))
<span style=3D"color: #006f00; font-weight: bold;">else</span>
(<span style=3D"color: #242521; font-weight: bold;">module</span> <span=
style=3D"color: #557400; font-weight: bold;">Map</span>.<span style=3D"col=
or: #242521;">Make</span>(<span style=3D"color: #242521;">Float</span>))
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">fail</span> =3D pp_map (f ())
</code></pre>
</div>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code> <span style=3D"color: #242521;">Error</=
span>: <span style=3D"color: #242521;">This</span> expression has <span sty=
le=3D"color: #242521; font-weight: bold;">type</span>
(<span style=3D"color: #006f00; font-weight: bold;">module</span> =
<span style=3D"color: #557400; font-weight: bold;">M</span> : <span style=
=3D"color: #557400; font-weight: bold;">Map.S</span>) ->
(<span style=3D"color: #557400; font-weight: bold;">Format.</span>=
formatter -> <span style=3D"color: #557400; font-weight: bold;">M.</span=
>key -> unit) ->
(<span style=3D"color: #557400; font-weight: bold;">Format.</span>=
formatter -> 'a -> unit) -> <span style=3D"color: #557400; font-we=
ight: bold;">Format.</span>formatter -> 'a <span style=3D"color: #557400=
; font-weight: bold;">M.</span>t -> unit
but an expression was expected <span style=3D"color: #006f00; font-w=
eight: bold;">of</span> <span style=3D"color: #242521; font-weight: bold;">=
type</span> (<span style=3D"color: #006f00; font-weight: bold;">module</spa=
n> <span style=3D"color: #557400; font-weight: bold;">Map.S</span>) -> 'b
<span style=3D"color: #242521;">The</span> <span style=3D"color: #24=
2521; font-weight: bold;">module</span> <span style=3D"color: #557400; font=
-weight: bold;">M</span> would escape its scope
<span style=3D"color: #242521;">This</span> <span style=3D"color: #006f00; =
font-weight: bold;">function</span> <span style=3D"color: #007a9f;">is</spa=
n> <span style=3D"color: #242521; font-weight: bold;">module</span>-depende=
nt. <span style=3D"color: #242521;">The</span> dependency is preserved
<span style=3D"color: #006f00; font-weight: bold;">when</span> the <span st=
yle=3D"color: #006f00; font-weight: bold;">function</span> <span style=3D"c=
olor: #007a9f;">is</span> passed a static <span style=3D"color: #242521; fo=
nt-weight: bold;">module</span> argument (<span style=3D"color: #006f00; fo=
nt-weight: bold;">module</span> <span style=3D"color: #557400; font-weight:=
bold;">M</span> : <span style=3D"color: #557400; font-weight: bold;">S</sp=
an>)
<span style=3D"color: #9f0d0f;">or</span> (<span style=3D"color: #006f00; f=
ont-weight: bold;">module</span> <span style=3D"color: #557400; font-weight=
: bold;">M</span>). <span style=3D"color: #242521;">Its</span> argument her=
e is <span style=3D"color: #9f0d0f;">not</span> static, so the <span style=
=3D"color: #242521; font-weight: bold;">type</span>-checker
tried instead <span style=3D"color: #006f00; font-weight: bold;">to</span> =
change the <span style=3D"color: #006f00; font-weight: bold;">function</spa=
n> <span style=3D"color: #007a9f;">type</span> <span style=3D"color: #444fc=
f; font-weight: bold;">to</span> be non-dependent.
</code></pre>
</div>
</div>
</div>
<div id=3D"outline-container-org63a17cd" class=3D"outline-4">
<h4 id=3D"org63a17cd">Relocatable Compiler</h4>
<div class=3D"outline-text-4" id=3D"text-org63a17cd">
<p>
A compiler installation can now be moved or copied with no risk
of hard-to-debug errors due to mixing incompatible bytecode runtime interpr=
eters.
</p>
<p>
In practice, this means that creating a local switch when there is a
global switch with the same compiler version and configuration
available can be done by cloning the global switch rather than
recompiling the whole compiler.
</p>
<p>
This should considerably reduce the time required to create
new local opam switches out-of-the-box.
</p>
</div>
</div>
<div id=3D"outline-container-org3b1e111" class=3D"outline-4">
<h4 id=3D"org3b1e111">Polymorphic Functions as Function Arguments</h4>
<div class=3D"outline-text-4" id=3D"text-org3b1e111">
<p>
Higher-rank polymorphic functions can now be defined directly by
using an explicit type annotation in a function argument
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">apply_map</span> (<sp=
an style=3D"color: #007a9f;">map</span>:<span style=3D"color: #444fcf; font=
-weight: bold;"> 'a 'b. ('a -> 'b) -> 'a list -> 'b list</span>) =
=3D
map string_of_int [1;2;3], map <span style=3D"color: #557400; font-weight=
: bold;">List.</span>singleton [<span style=3D"color: #ca3400;">"x"</span>;=
<span style=3D"color: #ca3400;">"y"</span>]
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">_</span> =3D apply_map <span style=3D"color: #557400; =
font-weight: bold;">List.</span>map
</code></pre>
</div>
<p>
Previously defining such a function required going through either a record =
or an object
with a polymorphic field or methods
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">type</span> <span style=3D"color: #444fcf; font-weight: bold;">m=
ap</span> =3D { map: 'a 'b. ('a -> 'b) -> 'a list -> 'b list }
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">apply_map</span> {<span style=3D"color: #007a9f;">map<=
/span>} =3D
map string_of_int [1;2;3], map <span style=3D"color: #557400; font-weight=
: bold;">List.</span>singleton [<span style=3D"color: #ca3400;">"x"</span>;=
<span style=3D"color: #ca3400;">"y"</span>]
</code></pre>
</div>
</div>
</div>
<div id=3D"outline-container-orgb0d6f1f" class=3D"outline-4">
<h4 id=3D"orgb0d6f1f">Search and Replace Substring Functions</h4>
<div class=3D"outline-text-4" id=3D"text-orgb0d6f1f">
<p>
The <code>String</code> module has been extended with many functions
for searching and replacing substrings inside a string.
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #007a9f;">_true</span> =3D <spa=
n style=3D"color: #557400; font-weight: bold;">String.</span>includes <span=
style=3D"color: #444fcf; font-weight: bold;">~affix</span>:<span style=3D"=
color: #ca3400;">"aba"</span> <span style=3D"color: #ca3400;">"abbaba"</spa=
n>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #007a9f;">sentence</span> =3D <span style=3D"color: #557400; fon=
t-weight: bold;">String.</span>replace_all <span style=3D"color: #444fcf; f=
ont-weight: bold;">~sub</span>:<span style=3D"color: #ca3400;">"𝄽"<=
/span> <span style=3D"color: #444fcf; font-weight: bold;">~by</span>:<span =
style=3D"color: #ca3400;">"word"</span> <span style=3D"color: #ca3400;">"A =
𝄽 is re𝄽ed"</span>
</code></pre>
</div>
<p>
The substring search is using the 2-way string matching algorithm
which has the advantage of requiring constant space memory overhead
independently of the needle size.
</p>
</div>
</div>
<div id=3D"outline-container-org28d4349" class=3D"outline-4">
<h4 id=3D"org28d4349">Generalised Local Definitions</h4>
<div class=3D"outline-text-4" id=3D"text-org28d4349">
<p>
It is now always possible to define locally a type,
a class, a module type or any kind of item that can be defined
globally:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">mandelbrot</span> <sp=
an style=3D"color: #007a9f;">n</span> <span style=3D"color: #007a9f;">x</sp=
an> =3D
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">type</span> <span style=3D"color: #444fcf; font-weight=
: bold;">t</span> =3D <span style=3D"color: #242521;">Converge</span> | <sp=
an style=3D"color: #242521;">Escape</span> <span style=3D"color: #006f00; f=
ont-weight: bold;">of</span> int <span style=3D"color: #242521; font-weight=
: bold;">in</span>
...
<span style=3D"color: #006f00; font-weight: bold;">match</span> orbit n x=
<span style=3D"color: #006f00; font-weight: bold;">with</span>
| <span style=3D"color: #242521;">Converge</span> -> 0
| <span style=3D"color: #242521;">Exit_at</span> n -> colorize n
</code></pre>
</div>
</div>
</div>
<div id=3D"outline-container-orgc94c531" class=3D"outline-4">
<h4 id=3D"orgc94c531">External Types</h4>
<div class=3D"outline-text-4" id=3D"text-orgc94c531">
<p>
When interfacing with foreign function libraries, it is now possible
to define external type
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">type</span> <span style=3D"color: #444fcf; font-weight: bold;">i=
nt_gmp</span> =3D <span style=3D"color: #242521; font-weight: bold;">extern=
al</span> <span style=3D"color: #ca3400;">"mpz_t"</span>
<span style=3D"color: #242521; font-weight: bold;">type</span> <span style=
=3D"color: #444fcf; font-weight: bold;">float_gmp</span> =3D <span style=3D=
"color: #242521; font-weight: bold;">external</span> <span style=3D"color: =
#ca3400;">"mpf_t"</span>
</code></pre>
</div>
<p>
Compared to an abstract type definition, the external type name
"mpz_t" (resp. <code>mpf_t</code>) makes the type distinguishable from any
non-abstract types or external types with a different name.
</p>
<p>
In particular, this makes FFI types better behaved when combined with
Generalised Abstract Data Types (GADTs). For instance, The typechecker
is able to prove that
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">ok</span>:<span style=
=3D"color: #444fcf; font-weight: bold;"> (int_gmp,[` </span><span style=3D"=
color: #242521;">A</span><span style=3D"color: #444fcf; font-weight: bold;"=
>] ) </span><span style=3D"color: #557400; font-weight: bold;">Type.</span>=
<span style=3D"color: #444fcf; font-weight: bold;">eq -> _ </span>=3D <s=
pan style=3D"color: #006f00; font-weight: bold;">function</span> <span styl=
e=3D"color: #007a9f;">_</span> -> .
</code></pre>
</div>
<p>
is a total function because the external type <code>int_gmp</code> is not c=
ompatible
with a polymorphic variant type.
</p>
</div>
</div>
<div id=3D"outline-container-org49e3d56" class=3D"outline-4">
<h4 id=3D"org49e3d56">Warning: Abstract types in the current module</h4>
<div class=3D"outline-text-4" id=3D"text-org49e3d56">
<p>
The astute reader has probably noticed in the definition above that,
in OCaml 5.4.0, the typechecker does accept
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">type</span> <span style=3D"color: #444fcf; font-weight: bold;">i=
nt_gmp</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">ok</span>:<span style=3D"color: #444fcf; font-weight: =
bold;"> (int_gmp, [` </span><span style=3D"color: #242521;">A</span><span s=
tyle=3D"color: #444fcf; font-weight: bold;">] ) </span><span style=3D"color=
: #557400; font-weight: bold;">Type.</span><span style=3D"color: #444fcf; f=
ont-weight: bold;">eq -> _ </span>=3D <span style=3D"color: #006f00; fon=
t-weight: bold;">function</span> <span style=3D"color: #007a9f;">_</span> -=
> .
</code></pre>
</div>
<p>
as total.
</p>
<p>
Indeed until OCaml 5.5.0, abstract types defined in the current module
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">type</span> <span style=3D"color: #444fcf; font-weight: bold;">a=
</span>
<span style=3D"color: #242521; font-weight: bold;">type</span> <span style=
=3D"color: #444fcf; font-weight: bold;">b</span>
</code></pre>
</div>
<p>
were considered as unique and provably different
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">let</span> <span style=3D"color: #a7601f;">f</span>:<span style=
=3D"color: #444fcf; font-weight: bold;"> 'x. (a,b) </span><span style=3D"co=
lor: #557400; font-weight: bold;">Type.</span><span style=3D"color: #444fcf=
; font-weight: bold;">eq -> 'x </span>=3D <span style=3D"color: #006f00;=
font-weight: bold;">function</span> <span style=3D"color: #007a9f;">_</spa=
n> -> .
</code></pre>
</div>
<p>
However, this special rule for local definition of abstract types was
very brittle. As soon as one moved outside of the current module, it
was no longer possible to prove that the types were different.
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">module</span> <span style=3D"color: #557400; font-weight: bold;"=
>M</span> =3D <span style=3D"color: #242521; font-weight: bold;">struct</sp=
an>
<span style=3D"color: #242521; font-weight: bold;">type</span> <span styl=
e=3D"color: #444fcf; font-weight: bold;">a</span>
<span style=3D"color: #242521; font-weight: bold;">type</span> <span styl=
e=3D"color: #444fcf; font-weight: bold;">b</span>
<span style=3D"color: #242521; font-weight: bold;">end</span>
<span style=3D"color: #242521; font-weight: bold;">let</span> <span style=
=3D"color: #a7601f;">fail</span>:<span style=3D"color: #444fcf; font-weight=
: bold;"> 'x. (</span><span style=3D"color: #557400; font-weight: bold;">M.=
</span><span style=3D"color: #444fcf; font-weight: bold;">a,</span><span st=
yle=3D"color: #557400; font-weight: bold;">M.</span><span style=3D"color: #=
444fcf; font-weight: bold;">b) </span><span style=3D"color: #557400; font-w=
eight: bold;">Type.</span><span style=3D"color: #444fcf; font-weight: bold;=
">eq -> 'x </span>=3D <span style=3D"color: #006f00; font-weight: bold;"=
>function</span> <span style=3D"color: #007a9f;">_</span> -> .
</code></pre>
</div>
<pre class=3D"example" id=3D"org93e6d9f">
Error: This match case could not be refuted.
Here is an example of a value that would reach it: Equal
</pre>
<p>
This special typechecking rule has been removed in OCaml 5.5.0. If you were=
relying on it,
for instance, because you used an abstract type as type-level label in a GA=
DTs, you
can change your abstract type definition to a possibly private abbreviation=
of a polymorphic variant
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">type</span> <span style=3D"color: #444fcf; font-weight: bold;">a=
</span> =3D <span style=3D"color: #006f00; font-weight: bold;">private</spa=
n> [<span style=3D"color: #242521;">`A</span>]
<span style=3D"color: #242521; font-weight: bold;">type</span> <span style=
=3D"color: #444fcf; font-weight: bold;">b</span> =3D [<span style=3D"color:=
#242521;">`B</span>]
</code></pre>
</div>
<p>
or a (possibly private) sum type
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #242521; font-weig=
ht: bold;">type</span> <span style=3D"color: #444fcf; font-weight: bold;">a=
</span> =3D <span style=3D"color: #242521;">A</span>
<span style=3D"color: #242521; font-weight: bold;">type</span> <span style=
=3D"color: #444fcf; font-weight: bold;">b</span> =3D <span style=3D"color: =
#006f00; font-weight: bold;">private</span> B
</code></pre>
</div>
<p>
If you were using an abstract type as both a type-level label and a FFI typ=
e, you
can now use an external type definition which will give you a provably dist=
inct type
even outside of the current module.
</p>
</div>
</div>
<div id=3D"outline-container-org5e643ba" class=3D"outline-4">
<h4 id=3D"org5e643ba">GC improvements</h4>
<div class=3D"outline-text-4" id=3D"text-org5e643ba">
<p>
Some of the ongoing work to improve the pacing of the garbage
collector has been integrated in OCaml 5.5.0, two of the important
changes in OCaml 5.5 GC are
</p>
<ul class=3D"org-ul">
<li>the addition of a sweep-only phase at the start of major GC</li>
<li>the addition of an idle phase to smooth the behaviour of the GC
at the start.</li>
</ul>
</div>
</div>
<div id=3D"outline-container-org1d734c0" class=3D"outline-4">
<h4 id=3D"org1d734c0">Many incremental changes</h4>
<div class=3D"outline-text-4" id=3D"text-org1d734c0">
<ul class=3D"org-ul">
<li>The Windows implementation is no more reliant on Winpthreads</li>
<li>Around 60 new standard library functions</li>
<li>Around 90 various improvements</li>
<li>A dozen of documentation updates</li>
<li>Around 40 bug fixes</li>
</ul>
<p>
Please report any unexpected behaviours on the <a href=3D"https://github.co=
m/ocaml/ocaml/issues">OCaml issue
tracker</a> and post any questions or
comments you might have on our <a href=3D"https://discuss.ocaml.org">discus=
sion forums</a>.
</p>
<p>
The full list of changes can be found in the full changelog.
</p>
<p>
Happy hacking,
Florian Angeletti for the OCaml team.
</p>
<p>
—
</p>
</div>
</div>
<div id=3D"outline-container-orgb541e18" class=3D"outline-4">
<h4 id=3D"orgb541e18">Installation Instructions</h4>
<div class=3D"outline-text-4" id=3D"text-orgb541e18">
<p>
The base compiler can be installed as an opam switch with the following com=
mands:
</p>
<pre class=3D"example" id=3D"org5d39402">
opam update
opam switch create 5.5.0
</pre>
<p>
The source code for the release is also directly available on:
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://github.com/ocaml/ocaml/releases/download/5.5.0/ocaml=
-5.5.0.tar.gz">GitHub</a></li>
<li><a href=3D"https://caml.inria.fr/pub/distrib/ocaml-5.5/ocaml-5.5.0.tar.=
gz">OCaml archives at Inria</a></li>
</ul>
</div>
<ul class=3D"org-ul">
<li><a id=3D"orga7c2cde"></a>Fine-Tuned Compiler Configuration<br />
<div class=3D"outline-text-5" id=3D"text-orga7c2cde">
<p>
If you want to tweak the configuration of the compiler, you can switch to t=
he option variant with:
</p>
<pre class=3D"example" id=3D"org4a72253">
opam update
opam switch create <switch_name> ocaml-variants.5.5.0+options <opt=
ion_list>
</pre>
<p>
where <code><option_list></code> is a space separated list of <code>o=
caml-option-*</code> packages. For instance, for a <code>flambda</code> and=
<code>no-flat-float-array</code> switch:
</p>
<pre class=3D"example" id=3D"org5d0baea">
opam switch create 5.5.0+flambda+nffa ocaml-variants.5.5.0+options ocaml-op=
tion-flambda ocaml-option-no-flat-float-array
</pre>
<p>
<i>Editor=E2=80=99s note: please read the post for the full changelog.</i>
</p>
</div>
</li>
</ul>
</div>
</div>
</div>
<div id=3D"outline-container-org22075c1" class=3D"outline-2">
<h2 id=3D"org22075c1">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-org22075c1">
<p>
If you happen to miss a CWN, you can <a href=3D"mailto:alan.schmitt@polytec=
hnique.org">send me a message</a> and I'll mail it to you, or go take a loo=
k at <a href=3D"https://alan.petitepomme.net/cwn/">the archive</a> or the <=
a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive=
s</a>.
</p>
<p>
If you also wish to receive it every week by mail, you may subscribe to the=
<a href=3D"https://sympa.inria.fr/sympa/info/caml-list">caml-list</a>.
</p>
<div class=3D"authorname" id=3D"org0d8f18a">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>
</div>
</div>
</div>
</div>
</body>
</html>
--==-=-=--
--=-=-=--
--===-=-=
Content-Type: application/pgp-signature; name="signature.asc"
-----BEGIN PGP SIGNATURE-----
iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmo6WvMbFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v
cmcACgkQBA0KO07S5cc8JQgAhS/98WcQ3j5IMXAe1gDxBSWnHCe/VE35gYUFs99d
dr/t0k9jPTqsanSWQHBpZsLtg1UfZG9elU/tYOO1GMyzge3nWG90l2qgEAwjSI4K
cGVIaXv2AUAKXqbQbG9mIntc0cbotiF6Q4S5qzedUTXFEs60bC2KhVEcjaDRP+HS
ADekG23LX2xJdKseY7wTC/A1x4i3wTlOC6TtlLJQPkSH6igOKsJ4P6gaf9hKDuAk
GlZpv3jP+E77b+MV8E7bW3iNXsjTie/isipOYkCaGqtIW1CfjAyE35VW3jDcfvIt
bQPtufAwTsJdT4Y6M6BBGPTvQZ0cJui1RMaLDqb7kwAmzQ==
=UOhN
-----END PGP SIGNATURE-----
--===-=-=--