Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt <[email protected]> Tue, 24 Mar 2026 10:58:06 +0100
Newsgroups gmane.comp.lang.caml.inria
Message-ID <[email protected]>
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64

SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl
ZWsgb2YgTWFyY2ggMTcgdG8gMjQsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkludHJvZHVj
aW5nIGF0ZG1sIChleHBlcmltZW50YWwpDQpFeHBlcmltZW50YWwgbW9kdWxlIGltcG9ydHMgaW4g
QVREIChBVEQgNC4wLjApDQpEdW5lIDMuMjINClBhcnNlZmY6IHBhcnNlciBjb21iaW5hdG9yIGxp
YnJhcnkgZm9yIE9DYW1sIDUNCk91dHJlYWNoeSBEZW1vIERheSBmb3IgRGVjZW1iZXIgMjAyNSBS
b3VuZA0KT2xkIENXTg0KDQoNCkludHJvZHVjaW5nIGF0ZG1sIChleHBlcmltZW50YWwpDQrilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0
cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1pbnRyb2R1Y2luZy1hdGRtbC1leHBlcmltZW50
YWwvMTc5MDgvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN
CiAgQVREIDQuMC4wIHdhcyByZWxlYXNlZCB0b2RheSBvbiBvcGFtLg0KDQogIFRoaXMgcmVsZWFz
ZSBpbnRyb2R1Y2VzICphdGRtbCosIGFuIGV4cGVyaW1lbnRhbCByZXBsYWNlbWVudCBmb3INCiAg
YXRkZ2VuLg0KDQogIFRoZSBnb2FsIGlzIHRvIG1vZGVybml6ZSB0aGUgaW1wbGVtZW50YXRpb24g
YW5kIG1ha2UgaXQgZWFzaWVyIHRvDQogIGV4dGVuZCwgd2hpbGUga2VlcGluZyBjb21wYXRpYmls
aXR5IHdpdGggZXhpc3RpbmcgQVREIHdvcmtmbG93cy4NCg0KICBIZXJlJ3MgYSBzYW1wbGUgaW5w
dXQgZmlsZSBgZXhhbXBsZS5hdGQnOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUgbG9j
YXRpb24gPSB7DQogIOKUgiAgIHJvdzogaW50Ow0KICDilIIgICBjb2x1bW46IGludDsNCiAg4pSC
ICAgP2ZpbGU6IHN0cmluZyBvcHRpb247DQogIOKUgiB9DQogIOKUlOKUgOKUgOKUgOKUgA0KDQog
IEF0ZG1sIGlzIGludm9rZWQgYXMgZm9sbG93cywgbm9ybWFsbHkgYnkgdGhlIGJ1aWxkIHN5c3Rl
bToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIGF0ZG1sIGV4YW1wbGUuYXRkDQogIOKUlOKU
gOKUgOKUgOKUgA0KDQogIEl0IHByb2R1Y2VzIGEgcGFpciBvZiBtbGkgYW5kIG1sIGZpbGVzLiBU
aGlzIGlzIGBleGFtcGxlLm1saSc6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCogQXV0by1n
ZW5lcmF0ZWQgZnJvbSAiZXhhbXBsZS5hdGQiIGJ5IGF0ZG1sLiAqKQ0KICDilIIgDQogIOKUgiB0
eXBlIGxvY2F0aW9uID0gew0KICDilIIgICByb3c6IGludDsNCiAg4pSCICAgY29sdW1uOiBpbnQ7
DQogIOKUgiAgIGZpbGU6IHN0cmluZyBvcHRpb247DQogIOKUgiB9DQogIOKUgiANCiAg4pSCIHZh
bCBjcmVhdGVfbG9jYXRpb24gOiByb3c6aW50IC0+IGNvbHVtbjppbnQgLT4gP2ZpbGU6c3RyaW5n
IC0+IHVuaXQgLT4gbG9jYXRpb24NCiAg4pSCIHZhbCBsb2NhdGlvbl9vZl95b2pzb24gOiBZb2pz
b24uU2FmZS50IC0+IGxvY2F0aW9uDQogIOKUgiB2YWwgeW9qc29uX29mX2xvY2F0aW9uIDogbG9j
YXRpb24gLT4gWW9qc29uLlNhZmUudA0KICDilIIgdmFsIGxvY2F0aW9uX29mX2pzb24gOiBzdHJp
bmcgLT4gbG9jYXRpb24NCiAg4pSCIHZhbCBqc29uX29mX2xvY2F0aW9uIDogbG9jYXRpb24gLT4g
c3RyaW5nDQogIOKUgiANCiAg4pSCIG1vZHVsZSBMb2NhdGlvbiA6IHNpZw0KICDilIIgICB0eXBl
IG5vbnJlYyB0ID0gbG9jYXRpb24NCiAg4pSCICAgdmFsIGNyZWF0ZSA6IHJvdzppbnQgLT4gY29s
dW1uOmludCAtPiA/ZmlsZTpzdHJpbmcgLT4gdW5pdCAtPiB0DQogIOKUgiAgIHZhbCBvZl95b2pz
b24gOiBZb2pzb24uU2FmZS50IC0+IHQNCiAg4pSCICAgdmFsIHRvX3lvanNvbiA6IHQgLT4gWW9q
c29uLlNhZmUudA0KICDilIIgICB2YWwgb2ZfanNvbiA6IHN0cmluZyAtPiB0DQogIOKUgiAgIHZh
bCB0b19qc29uIDogdCAtPiBzdHJpbmcNCiAg4pSCIGVuZA0KICDilJTilIDilIDilIDilIANCg0K
ICBSZWxlYXNlIG5vdGVzOiA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQvcmVsZWFzZXMv
dGFnLzQuMC4wPg0KDQogIERvY3VtZW50YXRpb246IDxodHRwczovL2F0ZC5yZWFkdGhlZG9jcy5p
by8+DQoNCiAgUHJvamVjdCBwYWdlOiA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQ+DQoN
Cg0KRXhwZXJpbWVudGFsIG1vZHVsZSBpbXBvcnRzIGluIEFURCAoQVREIDQuMC4wKQ0K4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft
bC5vcmcvdC9hbm4tZXhwZXJpbWVudGFsLW1vZHVsZS1pbXBvcnRzLWluLWF0ZC1hdGQtNC0wLTAv
MTc5MDkvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg
QVREIDQuMC4wIGFkZHMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGltcG9ydHMgYmV0d2VlbiBB
VEQgZmlsZXMuDQoNCiAgVGhpcyBhbGxvd3Mgc3BsaXR0aW5nIHNjaGVtYXMgYWNyb3NzIG11bHRp
cGxlIGZpbGVzIGluIGEgbmF0dXJhbCB3YXkuDQoNCiAgQ3VycmVudGx5IHN1cHBvcnRlZCBpbjoN
CiAg4oCiIGF0ZG1sIChPQ2FtbCkNCiAg4oCiIGF0ZHB5IChQeXRob24pDQogIOKAoiBhdGR0cyAo
VHlwZVNjcmlwdCkNCg0KICBFeGFtcGxlOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGZyb20g
dXRpbHMgYXMgdSBpbXBvcnQgZW1haWwNCiAg4pSCIA0KICDilIIgdHlwZSBlbWFpbF9hZGRyZXNz
ZXMgPSB1LmVtYWlsIGxpc3QNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRGV0YWlsczogPGh0dHBz
Oi8vZ2l0aHViLmNvbS9haHJlZnMvYXRkL3JlbGVhc2VzL3RhZy80LjAuMD4NCg0KICBGb3IgYW4g
ZWFybGllciBkaXNjdXNzaW9uIG9mIHRoZSBkZXNpZ24sIHNlZQ0KICA8aHR0cHM6Ly9kaXNjdXNz
Lm9jYW1sLm9yZy90L3JmYy1tdWx0aWZpbGUtYXRkLWRlZmluaXRpb24tc3VwcG9ydC12aWEtaW1w
b3J0LXN0YXRlbWVudHMvMTc4ODE+XS4NCg0KDQpEdW5lIDMuMjINCuKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u
LWR1bmUtMy0yMi8xNzkxMi8xPg0KDQoNClNob24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgRHVuZSB0ZWFtIGlzIHBsZWFzZWQg
dG8gYW5ub3VuY2UgW3RoZSByZWxlYXNlIG9mIGR1bmUgMy4yMi4wXS4NCg0KICBJbiBhZGRpdGlv
biB0byBtYW55IGZpeGVzIGFuZCBzbWFsbCBpbXByb3ZlbWVudHMsIG5vdGFibGUgaGlnaGxpZ2h0
cw0KICBvZiB0aGlzIHJlbGVhc2UgaW5jbHVkZToNCg0KICDigKIgRml4ZXMgdG8gdGhlIGR1bmUg
Y2FjaGUgb24gV2luZG93cywgdGhhbmtzIHRvIFtATmV2b3JdIGluDQogICAgW29jYW1sL2R1bmUj
MTM3MTNdLg0KICDigKIgTmV3IHRyYWNpbmcgZnVuY3Rpb25hbGl0eSwgdG8gaW5zcGVjdCBhbmQg
ZGlhZ25vc2UgdGhlIGJ1aWxkDQogICAgcHJvY2Vzc2VzIHRoYW5rcyB0byBbQHJncmluYmVyZ10g
YWNyb3NzIG1hbnkgUFJzLiBTZWUgW3RoZQ0KICAgIGRvY3VtZW50YXRpb25dLg0KICDigKIgQWRk
aXRpb24gb2YgdGhlIGBkdW5lLWFjdGlvbi10cmFjZScgbGlicmFyeSwgdG8gaW5zdHJ1bWVudCB0
cmFjZQ0KICAgIGVtaXNzaW9uLCB0aGFua3MgdG8gW0ByZ3JpbmJlcmddLg0KICDigKIgU3VwcG9y
dCBmb3IgZ2VuZXJhdGluZyBvZG9jIGRvY3VtZW50YXRpb24gaW4gbWFya2Rvd24gdmlhIHRoZQ0K
ICAgIGBAZG9jLW1hcmtkb3duJyBidWlsZCBhbGlhcyB0aGFua3MgdG8gW0BkYXZlc254XSBbb2Nh
bWwvZHVuZSMxMjU4MV0uDQogIOKAoiBGdWxsIHN1cHBvcnQgZm9yIE94Q2FtbCdzIHBhcmFtZXRl
cmlzZWQgbGlicmFyaWVzLCB0aGFua3MgdG8NCiAgICBbQGFydC13XSBhbmQgW0BtYWlzdGVdLiBU
byBsZWFybiBtb3JlLCBzZWUgW3RoZSBkb2NzXS4NCg0KICBTZWUgW3RoZSBmdWxsIGNoYW5nZWxv
Z10gZm9yIGFsbCBuZXcgZmVhdHVyZXMgYW5kIGZpeGVzLCBhbmQgZm9yDQogIGF0dHJpYnV0aW9u
IHRvIHRoZSBjb250cmlidXRvcnMgd2hvIG1hZGUgaXQgYWxsIHBvc3NpYmxlLiBUaGFuayB5b3Us
DQogIGNvbnRyaWJ1dG9ycyENCg0KICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRo
aXMgcmVsZWFzZSwgcGxlYXNlIHJlcG9ydCBpdCBpbiBbb3VyDQogIGlzc3VlIHRyYWNrZXJdLg0K
DQoNClt0aGUgcmVsZWFzZSBvZiBkdW5lIDMuMjIuMF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2Nh
bWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMi4wPg0KDQpbQE5ldm9yXSA8aHR0cHM6Ly9naXRodWIu
Y29tL05ldm9yPg0KDQpbb2NhbWwvZHVuZSMxMzcxM10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft
bC9kdW5lL3B1bGwvMTM3MTM+DQoNCltAcmdyaW5iZXJnXSA8aHR0cHM6Ly9naXRodWIuY29tL3Jn
cmluYmVyZz4NCg0KW3RoZSBkb2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9j
cy5pby9lbi9zdGFibGUvaGFja2luZy5odG1sI2luc3BlY3RpbmctdHJhY2VzLXdpdGgtanE+DQoN
CltAZGF2ZXNueF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlc254Pg0KDQpbb2NhbWwvZHVuZSMx
MjU4MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvMTI1ODE+DQoNCltAYXJ0
LXddIDxodHRwczovL2dpdGh1Yi5jb20vYXJ0LXc+DQoNCltAbWFpc3RlXSA8aHR0cHM6Ly9naXRo
dWIuY29tL21haXN0ZT4NCg0KW3RoZSBkb2NzXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5p
by9lbi9zdGFibGUvdHV0b3JpYWxzL294Y2FtbC1wYXJhbWV0ZXJpemVkLWxpYnJhcnkvaW5kZXgu
aHRtbD4NCg0KW3RoZSBmdWxsIGNoYW5nZWxvZ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9k
dW5lL3JlbGVhc2VzL3RhZy8zLjIyLjA+DQoNCltvdXIgaXNzdWUgdHJhY2tlcl0gPGh0dHBzOi8v
Z2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcz4NCg0KDQpQYXJzZWZmOiBwYXJzZXIgY29tYmlu
YXRvciBsaWJyYXJ5IGZvciBPQ2FtbCA1DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB
cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wYXJzZWZmLXBhcnNl
ci1jb21iaW5hdG9yLWxpYnJhcnktZm9yLW9jYW1sLTUvMTc5MTQvMT4NCg0KDQpEYXZpZCBTYW5j
aG8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBJ4oCZbSBzaGFy
aW5nICpQYXJzZWZmKiwgYSBwYXJzZXIgY29tYmluYXRvciBsaWJyYXJ5IGZvciAqT0NhbWwgNSou
DQoNCiAgSWYgeW91IGxpa2UgcGFyc2VyIGNvbWJpbmF0b3JzIGJ1dCBkb27igJl0IGxvdmUgd3Jp
dGluZyBldmVyeXRoaW5nIGluDQogIG1vbmFkaWMgc3R5bGUsIFBhcnNlZmYgaXMgYnVpbHQgZm9y
IHRoYXQuIFBhcnNlcnMgYXJlIHBsYWluIGZ1bmN0aW9ucw0KICAoYHVuaXQgLT4gJ2EnKSBhbmQg
eW91IGNvbXBvc2UgdGhlbSBpbiBkaXJlY3Qgc3R5bGUsIHdoaWxlIFBhcnNlZmYNCiAgaGFuZGxl
cyBiYWNrdHJhY2tpbmcgYW5kIHN0cmVhbWluZyB1bmRlciB0aGUgaG9vZCAodXNpbmcgZWZmZWN0
cyEpDQoNCg0KV2h5IFBhcnNlZmYNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K
DQogIOKAoiAqRGlyZWN0LXN0eWxlIEFQSSo6IHdyaXRlIHNlcXVlbnRpYWwgT0NhbWwgY29kZSwg
bm8gYD4+PScsIGBsZXQqJywNCiAgICAgb3IgYXBwbGljYXRpdmUgb3BlcmF0b3IgY2hhaW5zIHJl
cXVpcmVkLg0KICDigKIgKlR5cGVkIGVycm9ycyo6IHJhaXNlIGRvbWFpbiBlcnJvcnMgd2l0aCBw
b2x5bW9ycGhpYyB2YXJpYW50cyB2aWENCiAgICAgYFBhcnNlZmYuZXJyb3InLg0KICDigKIgKlN0
cmVhbWluZyBpbnB1dCo6IHNhbWUgcGFyc2VyIHdvcmtzIHdpdGggYFBhcnNlZmYucGFyc2UnIChz
dHJpbmcpDQogICAgIGFuZCBgUGFyc2VmZi5wYXJzZV9zb3VyY2UnIChzdHJlYW0pLg0KICDigKIg
Klplcm8tY29weSArIGZ1c2VkIG9wcyo6IHNwYW4gQVBJcyBhbmQgZnVzZWQgb3BlcmF0aW9ucyBm
b3IgaG90DQogICAgIHBhcnNpbmcgcGF0aHMuDQogIOKAoiAqRG9tYWluLXNhZmUgZXhlY3V0aW9u
KjogcGFyc2UgY2FsbHMgYXJlIHNlbGYtY29udGFpbmVkIChubyBnbG9iYWwNCiAgICAgbXV0YWJs
ZSBzdGF0ZSkuDQogIOKAoiBBdXRvbWF0aWMgYmFja3RyYWNraW5nIHdpdGggW2BQYXJzZWZmLm9y
XyddDQogIOKAoiBNaW5pbWFsIGRlcGVuZGVuY3kgZm9vdHByaW50OiBvbmx5IGByZScgZm9yIHJl
Z2V4DQoNCg0KW2BQYXJzZWZmLm9yXyddIDxodHRwczovL2RhdmVzbnguZ2l0aHViLmlvL3BhcnNl
ZmYvYXBpL2NvbWJpbmF0b3JzLyNvcl8+DQoNCg0KUGVyZm9ybWFuY2UNCuKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEluIHRoZSBpbmNsdWRlZCBiZW5jaG1hcmtzLCBQYXJz
ZWZmIGlzIGZhc3RlciB0aGFuIEFuZ3N0cm9tIGFuZA0KICBNUGFyc2VyOg0KDQogIOKAoiBhcm91
bmQgKn4yeCogaW4gZmFpciBjb21wYXJpc29ucw0KICDigKIgdXAgdG8gKn40eCsqIHdpdGggemVy
by1jb3B5IG9wdGltaXplZCBwYXRocw0KICBCZW5jaG1hcmsgZGV0YWlscyBhbmQgY29kZSBhcmUg
aW4gdGhlIHJlcG8gZG9jcy4NCg0KICAjIyBEb2N1bWVudGF0aW9uDQoNCiAgSeKAmXZlIHB1dCBh
IGxvdCBvZiBlZmZvcnQgaW50byB0aGUgZG9jcyAocXVpY2sgc3RhcnQsIGd1aWRlcywgYW5kIEFQ
SQ0KICBwYWdlcykgdG8ga2VlcCBQYXJzZWZmIGVhc3kgdG8gbGVhcm4uIEEgYml0IHByb3VkIG9m
IHVzaW5nIG9kb2PigJlzDQogIE1hcmtkb3duIGJhY2tlbmQgcGx1cyBtZHgsIEkgY2FuIGdlbmVy
YXRlIGFuZCBjaGVjayBleGFtcGxlcyBvbiB0aGUNCiAgZmx5LCBzbyBzbmlwcGV0cyBzdGF5IHR5
cGUtc2FmZS4NCg0KICA8aHR0cHM6Ly9kYXZlc254LmdpdGh1Yi5pby9wYXJzZWZmPg0KDQoNCklu
c3RhbGwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg
b3BhbSBpbnN0YWxsIHBhcnNlZmYgLXkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KTGlua3MNCuKV
jOKVjOKVjOKVjOKVjA0KDQogIOKAoiBEb2NzOiA8aHR0cHM6Ly9kYXZlc254LmdpdGh1Yi5pby9w
YXJzZWZmLz4NCiAg4oCiIENvbXBhcmlzb24gZ3VpZGU6DQogICAgPGh0dHBzOi8vZGF2ZXNueC5n
aXRodWIuaW8vcGFyc2VmZi9ndWlkZXMvY29tcGFyaXNvbi8+DQogIOKAoiBHaXRIdWI6IDxodHRw
czovL2dpdGh1Yi5jb20vZGF2ZXNueC9wYXJzZWZmPg0KDQogIElmIHlvdSB0cnkgaXQsIEnigJlk
IHJlYWxseSB2YWx1ZSBmZWVkYmFjayBvbjogQVBJIGVyZ29ub21pY3MsIGVycm9yDQogIGhhbmRs
aW5nIGV4cGVyaWVuY2Ugb3IgbWlzc2luZyBjb21iaW5hdG9ycyBvciBkb2NzIGdhcHMhDQoNCiAg
VGhhbmtzIQ0KDQoNCk91dHJlYWNoeSBEZW1vIERheSBmb3IgRGVjZW1iZXIgMjAyNSBSb3VuZA0K
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv
dC9vdXRyZWFjaHktZGVtby1kYXktZm9yLWRlY2VtYmVyLTIwMjUtcm91bmQvMTc4ODMvNT4NCg0K
DQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBQYXRyaWNrIEZlcnJpcyBhbm5vdW5jZWQNCuKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWNvcmRpbmcgb2Ygb3VyIChuZWFy
bHkgdHdvIGhvdXIhKSBtZWV0aW5nIGlzIG5vdyBvbmxpbmU6DQogIDxodHRwczovL3dhdGNoLm9j
YW1sLm9yZy93LzhhVXFNaEZ2aFFHcTRXSkxIM3VrakE+ICENCg0KICBUaGFuayB5b3UgdG8gZXZl
cnlvbmUgd2hvIGpvaW5lZCA6dHdvX2h1bXBfY2FtZWw6DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtz
ZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2Ug
YSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2
ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h
aWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBT
Y2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9s
eXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21t
ZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5w
ZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBh
LmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6
Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+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-03-24 Tue 10:55 -->
<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 }
  .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.03.17.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.03.31.html">Next Week</a>
</p>

<p>
Hello
</p>

<p>
Here is the latest OCaml Weekly News, for the week of March 17 to 24, 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">Introducing atdml (experimental)</a></li>
<li><a href=3D"#2">Experimental module imports in ATD (ATD 4.0.0)</a></li>
<li><a href=3D"#3">Dune 3.22</a></li>
<li><a href=3D"#4">Parseff: parser combinator library for OCaml 5</a></li>
<li><a href=3D"#5">Outreachy Demo Day for December 2025 Round</a></li>
<li><a href=3D"#org45c9929">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Introducing atdml (experimental)</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-introducing-atdml-exper=
imental/17908/1">https://discuss.ocaml.org/t/ann-introducing-atdml-experime=
ntal/17908/1</a>
</p>
</div>
<div id=3D"outline-container-org007e4c6" class=3D"outline-3">
<h3 id=3D"org007e4c6">Martin Jambon announced</h3>
<div class=3D"outline-text-3" id=3D"text-org007e4c6">
<p>
ATD 4.0.0 was released today on opam.
</p>

<p>
This release introduces <b>atdml</b>, an experimental replacement for atdge=
n.
</p>

<p>
The goal is to modernize the implementation and make it easier to extend,
while keeping compatibility with existing ATD workflows.
</p>

<p>
Here's a sample input file <code>example.atd</code>:
</p>
<pre class=3D"example" id=3D"org66feb81">
type location =3D {
  row: int;
  column: int;
  ?file: string option;
}
</pre>

<p>
Atdml is invoked as follows, normally by the build system:
</p>
<pre class=3D"example" id=3D"org2686dc1">
$ atdml example.atd
</pre>

<p>
It produces a pair of mli and ml files. This is <code>example.mli</code>:
</p>
<div class=3D"org-src-container">
<pre class=3D"src src-ocaml"><code><span style=3D"color: #8f6f4a; font-styl=
e: italic;">(* </span><span style=3D"color: #8f6f4a; font-style: italic;">A=
uto-generated from "example.atd" by atdml.</span><span style=3D"color: #8f6=
f4a; font-style: italic;"> *)</span>

<span style=3D"color: #242521; font-weight: bold;">type</span> <span style=
=3D"color: #444fcf; font-weight: bold;">location</span> =3D {
  row: int;
  column: int;
  file: string option;
}

<span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">create_location</span> : <span style=3D"color: #444fcf=
; font-weight: bold;">row</span>:int -&gt; <span style=3D"color: #444fcf; f=
ont-weight: bold;">column</span>:int -&gt; <span style=3D"color: #444fcf; f=
ont-weight: bold;">?file</span>:string -&gt; unit -&gt; location
<span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">location_of_yojson</span> : <span style=3D"color: #557=
400; font-weight: bold;">Yojson.Safe.</span>t -&gt; location
<span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">yojson_of_location</span> : location -&gt; <span style=
=3D"color: #557400; font-weight: bold;">Yojson.Safe.</span>t
<span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">location_of_json</span> : string -&gt; location
<span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">json_of_location</span> : location -&gt; string

<span style=3D"color: #242521; font-weight: bold;">module</span> <span styl=
e=3D"color: #557400; font-weight: bold;">Location</span> : <span style=3D"c=
olor: #242521; font-weight: bold;">sig</span>
  <span style=3D"color: #242521; font-weight: bold;">type</span> <span styl=
e=3D"color: #242521; font-weight: bold;">nonrec</span> <span style=3D"color=
: #444fcf; font-weight: bold;">t</span> =3D location
  <span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">create</span> : <span style=3D"color: #444fcf; font-we=
ight: bold;">row</span>:int -&gt; <span style=3D"color: #444fcf; font-weigh=
t: bold;">column</span>:int -&gt; <span style=3D"color: #444fcf; font-weigh=
t: bold;">?file</span>:string -&gt; unit -&gt; t
  <span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">of_yojson</span> : <span style=3D"color: #557400; font=
-weight: bold;">Yojson.Safe.</span>t -&gt; t
  <span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">to_yojson</span> : t -&gt; <span style=3D"color: #5574=
00; font-weight: bold;">Yojson.Safe.</span>t
  <span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">of_json</span> : string -&gt; t
  <span style=3D"color: #242521; font-weight: bold;">val</span> <span style=
=3D"color: #a7601f;">to_json</span> : t -&gt; string
<span style=3D"color: #242521; font-weight: bold;">end</span>
</code></pre>
</div>

<p>
Release notes:
<a href=3D"https://github.com/ahrefs/atd/releases/tag/4.0.0">https://github=
.com/ahrefs/atd/releases/tag/4.0.0</a>
</p>

<p>
Documentation:
<a href=3D"https://atd.readthedocs.io/">https://atd.readthedocs.io/</a>
</p>

<p>
Project page:
<a href=3D"https://github.com/ahrefs/atd">https://github.com/ahrefs/atd</a>
</p>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">Experimental module imports in ATD (ATD 4.0.0)</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-experimental-module-imp=
orts-in-atd-atd-4-0-0/17909/1">https://discuss.ocaml.org/t/ann-experimental=
-module-imports-in-atd-atd-4-0-0/17909/1</a>
</p>
</div>
<div id=3D"outline-container-orgc57b582" class=3D"outline-3">
<h3 id=3D"orgc57b582">Martin Jambon announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgc57b582">
<p>
ATD 4.0.0 adds experimental support for imports between ATD files.
</p>

<p>
This allows splitting schemas across multiple files in a natural way.
</p>

<p>
Currently supported in:
</p>
<ul class=3D"org-ul">
<li>atdml (OCaml)</li>
<li>atdpy (Python)</li>
<li>atdts (TypeScript)</li>
</ul>

<p>
Example:
</p>
<pre class=3D"example" id=3D"orgdc8527d">
from utils as u import email

type email_addresses =3D u.email list
</pre>

<p>
Details:
<a href=3D"https://github.com/ahrefs/atd/releases/tag/4.0.0">https://github=
.com/ahrefs/atd/releases/tag/4.0.0</a>
</p>

<p>
For an earlier discussion of the design, see <a href=3D"https://discuss.oca=
ml.org/t/rfc-multifile-atd-definition-support-via-import-statements/17881">=
https://discuss.ocaml.org/t/rfc-multifile-atd-definition-support-via-import=
-statements/17881</a>].
</p>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">Dune 3.22</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-dune-3-22/17912/1">http=
s://discuss.ocaml.org/t/ann-dune-3-22/17912/1</a>
</p>
</div>
<div id=3D"outline-container-orgcc413e6" class=3D"outline-3">
<h3 id=3D"orgcc413e6">Shon announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgcc413e6">
<p>
The Dune team is pleased to announce <a href=3D"https://github.com/ocaml/du=
ne/releases/tag/3.22.0">the release of dune 3.22.0</a>.
</p>

<p>
In addition to many fixes and small improvements, notable highlights of thi=
s release include:
</p>

<ul class=3D"org-ul">
<li>Fixes to the dune cache on Windows, thanks to <a href=3D"https://github=
.com/Nevor">@Nevor</a> in <a href=3D"https://github.com/ocaml/dune/pull/137=
13">ocaml/dune#13713</a>.</li>
<li>New tracing functionality, to inspect and diagnose the build processes =
thanks to <a href=3D"https://github.com/rgrinberg">@rgrinberg</a> across ma=
ny PRs. See <a href=3D"https://dune.readthedocs.io/en/stable/hacking.html#i=
nspecting-traces-with-jq">the documentation</a>.</li>
<li>Addition of the <code>dune-action-trace</code> library, to instrument t=
race emission, thanks to <a href=3D"https://github.com/rgrinberg">@rgrinber=
g</a>.</li>
<li>Support for generating odoc documentation in markdown via the <code>@do=
c-markdown</code> build alias thanks to <a href=3D"https://github.com/daves=
nx">@davesnx</a> <a href=3D"https://github.com/ocaml/dune/pull/12581">ocaml=
/dune#12581</a>.</li>
<li>Full support for OxCaml's parameterised libraries, thanks to  <a href=
=3D"https://github.com/art-w">@art-w</a> and  <a href=3D"https://github.com=
/maiste">@maiste</a>. To learn more, see <a href=3D"https://dune.readthedoc=
s.io/en/stable/tutorials/oxcaml-parameterized-library/index.html">the docs<=
/a>.</li>
</ul>

<p>
See <a href=3D"https://github.com/ocaml/dune/releases/tag/3.22.0">the full =
changelog</a>
for all new features and fixes, and for attribution to the contributors who=
 made
it all possible. Thank you, contributors!
</p>

<p>
If you encounter a problem with this release, please report it in <a href=
=3D"https://github.com/ocaml/dune/issues">our issue
tracker</a>.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">Parseff: parser combinator library for OCaml 5</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-parseff-parser-combinat=
or-library-for-ocaml-5/17914/1">https://discuss.ocaml.org/t/ann-parseff-par=
ser-combinator-library-for-ocaml-5/17914/1</a>
</p>
</div>
<div id=3D"outline-container-org218e0b6" class=3D"outline-3">
<h3 id=3D"org218e0b6">David Sancho announced</h3>
<div class=3D"outline-text-3" id=3D"text-org218e0b6">
<p>
Hi everyone,
</p>

<p>
I=E2=80=99m sharing <b>Parseff</b>, a parser combinator library for <b>OCam=
l 5</b>.
</p>

<p>
If you like parser combinators but don=E2=80=99t love writing everything in=
 monadic style, Parseff is built for that. Parsers are plain functions (<co=
de>unit -&gt; 'a</code>) and you compose them in direct style, while Parsef=
f handles backtracking and streaming under the hood (using effects!)
</p>
</div>
<div id=3D"outline-container-org9b514fe" class=3D"outline-4">
<h4 id=3D"org9b514fe">Why Parseff</h4>
<div class=3D"outline-text-4" id=3D"text-org9b514fe">
<ul class=3D"org-ul">
<li><b>Direct-style API</b>: write sequential OCaml code, no <code>&gt;&gt;=
=3D</code>, <code>let*</code>, or applicative operator chains required.</li>
<li><b>Typed errors</b>: raise domain errors with polymorphic variants via =
<code>Parseff.error</code>.</li>
<li><b>Streaming input</b>: same parser works with <code>Parseff.parse</cod=
e> (string) and <code>Parseff.parse_source</code> (stream).</li>
<li><b>Zero-copy + fused ops</b>: span APIs and fused operations for hot pa=
rsing paths.</li>
<li><b>Domain-safe execution</b>: parse calls are self-contained (no global=
 mutable state).</li>
<li>Automatic backtracking with <a href=3D"https://davesnx.github.io/parsef=
f/api/combinators/#or_"><code>Parseff.or_</code></a></li>
<li>Minimal dependency footprint: only <code>re</code> for regex</li>
</ul>
</div>
</div>
<div id=3D"outline-container-orgf90f8ad" class=3D"outline-4">
<h4 id=3D"orgf90f8ad">Performance</h4>
<div class=3D"outline-text-4" id=3D"text-orgf90f8ad">
<p>
In the included benchmarks, Parseff is faster than Angstrom and MParser:
</p>

<ul class=3D"org-ul">
<li>around <b>~2x</b> in fair comparisons</li>
<li>up to <b>~4x+</b> with zero-copy optimized paths</li>
</ul>
<p>
Benchmark details and code are in the repo docs.
</p>

<p>
## Documentation
</p>

<p>
I=E2=80=99ve put a lot of effort into the docs (quick start, guides, and AP=
I pages) to keep Parseff easy to learn. A bit proud of using odoc=E2=80=99s=
 Markdown backend plus mdx, I can generate and check examples on the fly, s=
o snippets stay type-safe.
</p>

<p>
<a href=3D"https://davesnx.github.io/parseff">https://davesnx.github.io/par=
seff</a>
</p>
</div>
</div>
<div id=3D"outline-container-org9267b54" class=3D"outline-4">
<h4 id=3D"org9267b54">Install</h4>
<div class=3D"outline-text-4" id=3D"text-org9267b54">
<pre class=3D"example" id=3D"orgd48892d">
opam install parseff -y
</pre>
</div>
</div>
<div id=3D"outline-container-org6d82316" class=3D"outline-4">
<h4 id=3D"org6d82316">Links</h4>
<div class=3D"outline-text-4" id=3D"text-org6d82316">
<ul class=3D"org-ul">
<li>Docs: <a href=3D"https://davesnx.github.io/parseff/">https://davesnx.gi=
thub.io/parseff/</a></li>
<li>Comparison guide: <a href=3D"https://davesnx.github.io/parseff/guides/c=
omparison/">https://davesnx.github.io/parseff/guides/comparison/</a></li>
<li>GitHub: <a href=3D"https://github.com/davesnx/parseff">https://github.c=
om/davesnx/parseff</a></li>
</ul>

<p>
If you try it, I=E2=80=99d really value feedback on: API ergonomics, error =
handling experience or  missing combinators or docs gaps!
</p>

<p>
Thanks!
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">Outreachy Demo Day for December 2025 Round</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/outreachy-demo-day-for-dece=
mber-2025-round/17883/5">https://discuss.ocaml.org/t/outreachy-demo-day-for=
-december-2025-round/17883/5</a>
</p>
</div>
<div id=3D"outline-container-orga3339df" class=3D"outline-3">
<h3 id=3D"orga3339df">Continuing this thread, Patrick Ferris announced</h3>
<div class=3D"outline-text-3" id=3D"text-orga3339df">
<p>
The recording of our (nearly two hour!) meeting is now online: <a href=3D"h=
ttps://watch.ocaml.org/w/8aUqMhFvhQGq4WJLH3ukjA">https://watch.ocaml.org/w/=
8aUqMhFvhQGq4WJLH3ukjA</a> !
</p>

<p>
Thank you to everyone who joined :two_hump_camel:
</p>
</div>
</div>
</div>
<div id=3D"outline-container-org45c9929" class=3D"outline-2">
<h2 id=3D"org45c9929">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-org45c9929">
<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"orgd01364e">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>

</div>
</div>
</div>
</div>
</body>
</html>


--=-=-=--