Previous week Up Next week


Here is the latest OCaml Weekly News, for the week of March 29 to April 05, 2016.

  1. Tensorflow bindings for OCaml
  2. the latest obuild (v0.1.8) supports ppx
  3. 4.03.0+beta2
  4. qtest 2.2, merged with qcheck
  5. Other OCaml News

Tensorflow bindings for OCaml


Continuing this thread, Laurent Mazare announced:
We've started putting together some TensorFlow bindings for OCaml. It's very
much a work in progress so there are some rough edges: some operators are not
supported, the api is likely to change, you may even get some segfaults, etc.
However it can already be used to train a convolutional neural network to
recognize digits with 98% accuracy.
Here are a couple highlights:
- The code for most operators is automatically generated from the TensorFlow
protobuf specs.
- The supported optimizers are gradient descent, momentum, and the adam
- The gradient backpropagation graph is generated within the OCaml wrapper. We
need to register the gradients for each operator manually, this has already been
done for ~30 operators.
- The api should be pretty straightforward, as an example here is a simple
linear classifier for the MNIST dataset:

Some installation instructions can be found on the main page of the project.
Installation is quite tricky for now as one has to compile or extract but we're hoping to improve this soon.

Any feedback would be very welcome.

(this has been cross-posted to the tensorflow-discuss group)

the latest obuild (v0.1.8) supports ppx


Francois Berenger announced:
Obuild is a very simple build system for users and developers
of OCaml libraries and programs.
Obuild acts as a building black box: users only declare what they want to build
and with which sources; the build system will consistently
build it.

The maintainer of obuild (Jerome Maloberti) just added ppx support.
This will be available soon in opam, starting from obuild version 0.1.8.



Damien Doligez announced:
Dear OCaml users,

OCaml release 4.03.0 will arrive in about 2 weeks.  We have
created a second beta version for your testing pleasure.  Please
test your favourite software with it and let me know whether it
works for you.

If you are a library author, please make sure your library will
work with 4.03.0, and update it if needed.

This beta version is available as an OPAM switch (4.03.0+beta2)
and also as source code at this address:

Happy hacking,

-- Damien Doligez for the OCaml team.

OCaml 4.03.0:

(Changes that can break existing programs are marked with a "*")

Language features:

- PR#5528: inline records for constructor arguments
  (Alain Frisch)

- PR#6220, PR#6403, PR#6437, PR#6801:
  Improved redundancy and exhaustiveness checks for GADTs.
  Namely, the redundancy checker now checks whether the uncovered pattern
  of the pattern is actually inhabited, exploding at most one wild card.
  This is also done for exhaustiveness when there is only one case.
  Additionally, one can now write unreachable cases, of the form
  "pat -> .", which are treated by the redundancy check.
  (Jacques Garrigue)

- PR#6374: allow "_ t" as a short-hand for "(_, _, ..) t" for n-ary type
  (Alain Frisch)

- PR#6714: allow [@@ocaml.warning] on most structure and signature items:
  values, modules, module types

- PR#6806: Syntax shortcut for putting a type annotation on a record field:
  { f1 : typ = e } is sugar for { f1 = (e : typ) }
  { f1 : typ } is sugar for { f1 = (f1 : typ) }
  (Valentin Gatien-Baron, review by Jérémie Dimino)

- PR#6806: Allow type annotations before the "->" in "fun <args> -> <expr>"
  fun x y : (int * int) -> (x, y)
  (Valentin Gatien-Baron, review by Jérémie Dimino)

- GPR#26: support for "(type a b)" as syntactic sugar for "(type a) (type b)"
  (Gabriel Scherer)

- GPR#42: short functor type syntax: "S -> T" for "functor (_ : S) -> T"
  (Leo White)

- GPR#88: allow field punning in object copying expressions:
  {< x; y; >} is sugar for {< x = x; y = y; >}
  (Jeremy Yallop)

- GPR#112: octal escape sequences for char and string literals
  "Make it \o033[1mBOLD\o033[0m"
  (Rafaël Bocquet, request by John Whitingthon)

- GPR#167: allow to annotate externals' arguments and result types so
  they can be unboxed or untagged: [@unboxed], [@untagged]. Supports
  untagging int and unboxing int32, int64, nativeint and float.
  (Jérémie Dimino, Mark Shinwell)

- GPR#173: [@inline] and [@inlined] attributes (for function declarations
  and call sites respectively) to control inlining
  (Pierre Chambart, Mark Shinwell)

- GPR#188: accept [@@immediate] attribute on type declarations to mark types
  that are represented at runtime by an integer
  (Will Crichton, reviewed by Leo White)

* GPR#234: allow "[]" as a user-defined constructor. Demand parenthesis
  around "::" when using "::" as user-defined constructor:
  code using "| :: of ..." must change to "| (::) of ...".
  (Runhang Li, review by Damien Doligez)

- GPR#240: replace special annotations on externals by attributes:
  * "float" is generalized to [@@unboxed]
  * "noalloc" becomes [@@noalloc]
  Deprecate "float" and "noalloc".
  (Jérémie Dimino)

- GPR#254: @ocaml.warn_on_literal_pattern attribute on constructors to
  warn when the argument is matches against a constant pattern.  This
  attribute is applied on predefined exception constructors which
  carry purely informational (with no stability guarantee) messages.
  (Alain Frisch)

- GPR#268: hexadecimal notation for floating-point literals: -0x1.ffffp+987
  In OCaml source code, FP literals can be written using the hexadecimal
  notation 0x<mantissa in hex>p<exponent> from ISO C99.
  (Xavier Leroy)

- GPR#273: allow to get the extension slot of an extension constructor
  by writing [%extension_constructor <path>]
  (Jérémie Dimino)

- GPR#282: change short-paths penalty heuristic to assign the same cost to
  idents containing double underscores as to idents starting with an underscore
  (Thomas Refis, Leo White)

- PR#6681 GPR#326: signature items are now accepted as payloads for
  extension and attributes, using the syntax [%foo: SIG ] or [@foo: SIG ].
  Examples: "[%%client: val foo : int]" or "val%client foo : int".
  (Alain Frisch and Gabriel Radanne)

* GPR#342: Allow shortcuts for extension and attributes on all keywords:
  module%foo, class[@foo], etc.
  The attribute in "let[@foo] .. in .." is now attached to the value binding,
  not to the expression.
  (Gabriel Radanne)


* PR#4231, PR#5461: warning 31 is now fatal by default
  (Warning 31: A module is linked twice in the same executable.)
  This is an interim solution; double-linking of modules has dangerous semantics,
  eg. exception constructors end up with two distinct declarations.
  (Alain Frisch)

- PR#4800: better compilation of tuple assignment
  (Gabriel Scherer and Alain Frisch)

- PR#5995: keep -for-pack into account to name exceptions;
  -for-pack should now be used during bytecode compilation as well
  (Alain Frisch, report by Christophe Troestler)

- PR#6400: better error message for '_' used as an expression
  (Alain Frisch, report by whitequark)

- PR#6501: harden the native-code generator against certain uses of "%identity"
  (Xavier Leroy, report by Antoine Miné)

- PR#6636: add --version option

- PR#6679: fix pprintast printing of constraints in type declarations
  (Alain Frisch, report by Jun Furuse)

- PR#6737: fix Typedtree attributes on (fun x -> body) expressions
  (Alain Frisch, report by Oleg Kiselyov)

* PR#6865: remove special case for parsing "let _ = expr" in structures
  (Jérémie Dimino, Alain Frisch)

* PR#6438, PR#7059, GPR#315: Pattern guard disables exhaustiveness check
  (function Some x when x = 0 -> ()) will now raise warning 8 (non-exhaustive)
  instead of warning 25 (all clauses are guarded). 25 isn't raised anymore.
  Projects that set warning 8 as an error may fail to compile (presumably
  this is the semantics they wanted).
  (Alain Frisch, request by Martin Jambon and John Whitington)

- PR#6920: fix debug informations around uses of %apply or %revapply
  (Jérémie Dimino, report by Daniel Bünzli)

- PR#6939: Segfault with improper use of let-rec
  (Alain Frisch)

- PR#6943: native-code generator for POWER/PowerPC 64 bits, both in
  big-endian (ppc64) and little-endian (ppc64le) configuration.
  (Xavier Leroy, with inspiration from RedHat's unofficial ppc64 and ppc64le

- PR#6979: better code generation in x86-32 backend for copying floats to
  the stack
  (Marc Lasson, review by Xavier Leroy)

- PR#7018: fix missing identifier renaming during inlining
  (Alain Frisch, review by Xavier Leroy)

- PR#7022, GPR#259: unbox float and boxed ints earlier, avoid second pass
  (Alain Frisch)

- PR#7026, GPR#288: remove write barrier for polymorphic variants without
  (Simon Cruanes)

- PR#7031: new warning 57, ambiguous guarded or-patterns
  (Luc Maranget, Gabriel Scherer, report by Martin Clochard and Claude Marché)

- PR#7064, GPR#316: allowing to mark compilation units and sub-modules as
  (Alain Frisch)

- PR#7067: fix performance regression (wrt. 4.01) in the native compiler
  for long nested structures
  (Alain Frisch, report by Daniel Bünzli, review by Jacques Garrigue)

- PR#7097: fix strange syntax error message around illegal packaged module
  signature constraints
  (Alain Frisch, report by Jun Furuse)

- PR#7118, PR#7120, GPR#408, GPR#476: Bug fixed in stack unwinding
  metadata generation. Was a cause of crashes in GUI programs on OS X.
  (Bart Jacobs, review by Mark Shinwell)

- GPR#17: some cmm optimizations of integer operations with constants
  (Stephen Dolan, review by Pierre Chambart)

- GPR#89: improve type-specialization of unapplied primitives:
  unapplied annotations (compare : int -> _),
  type propagation (List.sort compare [1;2;3])
  and propagation from module signatures now lead to specialization
  (Frédéric Bour, review by Gabriel Scherer)

- GPR#107: Prevent more unnecessary float boxing, especially in `if` and `match`
  (Vladimir Brankov, review by Alain Frisch)

- GPR#109: new (lazy) unboxing strategy for float and int references
  (Vladimir Brankov, review by Alain Frisch)

- GPR#115: More precise typing of values at the C-- and Mach level.
  (Xavier Leroy, review by Pierre Chambart)

- GPR#132: Flambda: new intermediate language and "middle-end" optimizers
  (Pierre Chambart, Mark Shinwell, Leo White)

- GPR#207: Colors in compiler messages (warnings, errors)
  configure with -color {auto|always|never} or TERM=dumb
  (Simon Cruanes, review by Gabriel Scherer)

- GPR#258: more precise information on PowerPC instruction sizes
  (Pierre Chambart, Xavier Leroy)

- GPR#263: improve code generation for if-equivalents of (&&) and (||)
  (Pierre Chambart)

- GPR#270: Make [transl_exception_constructor] generate [Immutable] blocks
  (Mark Shinwell)

- GPR#271: Fix incorrect mutability flag when records are built using "with"
  (Mark Shinwell)

- GPR#275: native-code generator for IBM z System running Linux.
  In memoriam Gene Amdahl, 1922-2015.
  (Bill O'Farrell, Tristan Amini, Xavier Leroy)

- GPR#282: relax short-paths safety check in presence of module aliases, take
  penalty into account while building the printing map.
  (Thomas Refis, Leo White)

- GPR#306: Instrument the compiler to debug performance regressions
  (Pierre Chambart)

- GPR#319: add warning 58 for missing cmx files, and
  extend -opaque option to mli files: a missing .cmx does not warn
  if the corresponding .cmi is compiled -opaque.
  (Leo White)

- GPR#388: OCAML_FLEXLINK environment variable allows overriding flexlink
  command (David Allsopp)

- GPR#392: put all parsetree invariants in a new module Ast_invariants
  (Jérémie Dimino)

- GPR#407: don't display the name of compiled .c files when calling the
  Microsoft C Compiler (same as the assembler).
  (David Allsopp)

- GPR#431: permit constant float arrays to be eligible for pattern match
  branch merging
  (Pierre Chambart)

- GPR#455: provide more debugging information to Js_of_ocaml
  (Jérôme Vouillon)

Runtime system:

- PR#3612, PR#92: allow allocating custom block with finalizers
  in the minor heap.
  (Pierre Chambart)

* PR#6517: use ISO C99 types {,u}int{32,64}_t in preference to our homegrown
  types {,u}int{32,64}.
  C stubs may have to be updated as {,u}int{32,64}_t are not defined anymore.
  (Xavier Leroy)

- PR#6760: closures evaluated in the toplevel can now be marshalled
  (whitequark, review by Jacques-Henri Jourdan)

- PR#6902, GPR#210: emit a runtime warning on stderr
  when finalizing an I/O channel which is still open:
    "channel opened on file '...' dies without being closed"
  this is controlled by OCAMLRUNPARAM=W=1 or with Sys.enable_runtime_warnings.
  The behavior of affected program is not changed,
  but they should still be fixed.
  (Alain Frisch, review by Damien Doligez)

- Signal handling: for read-and-clear, use GCC/Clang atomic builtins
  if available.
  (Xavier Leroy)

- PR#6910, GPR#224: marshaling (output_value, input_value, et al)
  now support marshaled data bigger than 4 Gb.
  (Xavier Leroy)

* GPR#226: select higher levels of optimization for GCC >= 3.4 and Clang
  when compiling the run-time system and C stub code.
  "-std=gnu99 -O2 -fno-strict-aliasing -fwrapv" is used by default.
  This also affects default flags for user stubs compiled with "ocamlc -c foo.c"
  and may uncover bugs in them.
  (Xavier Leroy)

- GPR#262: Multiple GC roots per compilation unit
  (Pierre Chambart, Mark Shinwell, review by Damien Doligez)

* GPR#297: Several changes to improve the worst-case GC pause time.
  Changes Gc.control and Gc.major_slice and adds functions to the Gc module.
  (Damien Doligez, with help from Francois Bobot, Thomas Braibant, Leo White)

- GPR#325: Add v=0x400 flag to OCAMLRUNPARAM to display GC stats on exit
  (Louis Gesbert, review by Alain Frisch)

Standard library:

- PR#1460, GPR#230: Array.map2, Array.iter2
  (John Christopher McAlpine)

- PR#5197, GPR#63: Arg: allow flags such as --flag=arg as well as --flag arg
  (Richard Jones)

- PR#6017, PR#7034, GPR#267: More efficient ifprintf implementation
  (Jeremy Yallop, review by Gabriel Scherer)

- PR#6296: Some documentation on the floating-point representations
    recognized by Pervasives.float_of_string
  (Xavier Leroy)

- PR#6316: Scanf.scanf failure on %u formats when reading big integers
  (Xavier Leroy, Benoît Vaugon)

- PR#6321: guarantee that "hypot infinity nan = infinity"
  (for conformance with ISO C99)
  (Xavier Leroy)

- PR#6390, GPR#36: expose Sys.{int_size,max_wosize} for js_of_ocaml portability
  (Hugo Heuzard)

- PR#6449: Add Map.union
  (Alain Frisch)

* PR#6494: Add 'equal' functions in modules
  Bytes, Char, Digest, Int32, Int64, Nativeint, and String
  Users defining their own modules with signature 'module type of Int32'
  have to extend their implementation.
  (Romain Calascibetta)

* PR#6524, GPR#79: Filename: Optional ?perms argument to open_temp_file
  May break partial applications of the function (fix by passing ?perms:None)
  (Daniel Bünzli, review by Jacques-Pascal Deplaix)

* PR#6525, GPR#80: Add Uchar module to the standard library
  May introduce module name conflicts with existing projects.
  (Daniel Bünzli, review by Yoriyuki Yamagata and Damien Doligez)

- PR#6577: improve performance of %L, %l, %n, %S, %C format specifiers
  (Alain Frisch)

- PR#6585: fix memory leak in win32unix/createprocess.c
  (Alain Frisch, report by user 'aha')

- PR#6645, GPR#174: Guarantee that Set.add, Set.remove, Set.filter
  return the original set if no change is required
  (Alain Frisch, Mohamed Iguernlala)

- PR#6649, GPR#222: accept (int_of_string "+3")
  (John Christopher McAlpine)

- PR#6694, PR#6695, GPR#124: deprecate functions using ISO-8859-1 character set
  in Char, Bytes, String and provide alternatives *_acii using US-ASCII.
  Affected functions:
  (whitequark, review by Damien Doligez)

- GPR#22: Add the Ephemeron module that implements ephemerons and weak
  hash table
  (François Bobot, review by Damien Doligez, Daniel Bünzli,
  Alain Frisch, Pierre Chambart)

- GPR#164: more efficient (branchless) implementation of
  specialized at type 'float'.
  (Vladimir Brankov)

- GPR#175: Guarantee that Map.add, Map.remove, Map.filter
  return the original map if no change is required.
  (Mohamed Iguernlala)

- GPR#201: generalize types of Printf.{ifprintf,ikfprintf}
  (Maxence Guesdon)

- GPR#216: add the missing POSIX.1-2001 signals in Sys
  (Guillaume Bury)

- GPR#239: remove type-unsafe code from Stream
  (Pierre Chambart, review by Gabriel Scherer and Jeremy Yallop)

- GPR#250: Check for negative start element in Array.sub
  (Jeremy Yallop)

- GPR#265: new implementation of Queue avoiding Obj.magic
  (Jérémie Dimino)

- GPR#268, GPR#303: '%h' and '%H' modifiers for printf and scanf to
  support floating-point numbers in hexadecimal notation
  (Xavier Leroy, Benoît Vaugon)

- GPR#272: Switch classify_float to [@@unboxed]
  (Alain Frisch)

- Improve speed of classify_float by not going through fpclassify()
  (Alain Frisch, Xavier Leroy)

- GPR#277: Switch the following externals to [@@unboxed]:
  * {Nativeint,Int32,Int64}.{of,to}_float
  * Int{32,64}.float_of_bits
  * Int{32,64}.bits_of_float
  (Jérémie Dimino)

- GPR#281: Switch the following externals to [@@unboxed]:
  * Sys.time (and [@@noalloc])
  * Pervasives.ldexp (and [@@noalloc])
  * for float, nativeint, int32, int64.
  (François Bobot)

- PR#3622, GPR#195: add function Stack.fold
  (Simon Cruanes)

- GPR#329: Add exists, for_all,  mem and memq functions in Array
  (Bernhard Schommer)

- GPR#337: Add [Hashtbl.filter_map_inplace]
  (Alain Frisch)

- GPR#356: Add [Format.kasprintf]
  (Jérémie Dimino, Mark Shinwell)

Type system:

- PR#5545: Type annotations on methods cannot control the choice of abbreviation
  (Jacques Garrigue)

* PR#6465: allow incremental weakening of module aliases.
  This is done by adding equations to submodules when expanding aliases.
  In theory this may be incompatible is some corner cases defining a module
  type through inference, but no breakage known on published code.
  (Jacques Garrigue)

- PR#6593: Functor application in tests/basic-modules fails after commit 15405
  (Jacques Garrigue)

Toplevel and debugger:

- PR#6113: Add descriptions to directives, and display them via #help
  (Nick Giannarakis, Berke Durak, Francis Southern and Gabriel Scherer)

- PR#6396: Warnings-as-errors not properly flushed in the toplevel
  (Alain Frisch)

- PR#6401: use proper error reporting for toplevel environment initialization:
  no more Env.Error(_) at start time
  (Gabriel Scherer, Alain Frisch)

- PR#6468: toplevel now supports backtraces if invoked with OCAMLRUNPARAM=b
  (whitequark and Jake Donham,
   review by Gabriel Scherer and Jacques-Henri Jourdan)

- PR#6935, GPR#298: crash in debugger when load_printer is given a directory
  (Junsong Li, review by Gabriel Scherer)

- PR#7081: report preprocessor warnings in the toplevel
  (Valentin Gatien-Baron, review by Jérémie Dimino)

- PR#7098: Loss of ppx context in toplevel after an exception
  (Alain Frisch, report by whitequark)

- PR#7101: The toplevel does not close in_channel for libraries specified on
  its command line
  (Alain Frisch)

- PR#7119: the toplevel does not respect [@@@warning]
  (Alain Frisch, report by Gabriel Radanne)

Other libraries:

* Unix library: channels created by Unix.in_channel_of_descr or
  Unix.out_channel_of_descr no longer support text mode under Windows.
  Calling [set_binary_mode_{in,out} chan false] on these channels
  now causes an error.
  (Xavier Leroy)

- PR#4023 and GPR#68: add Unix.sleepf (sleep with sub-second resolution)
  (Evgenii Lepikhin and Xavier Leroy)

* Protect Unix.sleep against interruptions by handled signals.
  Before, a handled signal could cause Unix.sleep to return early.
  Now, the sleep is restarted until the given time is elapsed.
  (Xavier Leroy)

* PR#6120, GPR#462: implement Unix.symlink and Unix.readlink on
  Windows. Unix.symlink has a new optional argument to_dir (ignored on
  non-native Windows platforms). stat functions reimplemented to avoid
  buggy Microsoft CRT implementations (native Windows only)
  (David Allsopp, review by Daniel Bünzli)

- PR#6263: add kind_size_in_bytes and size_in_bytes functions
  to Bigarray module.
  (Runhang Li, review by Mark Shinwell)

- PR#6289: Unix.utimes uses the current time only if both arguments
    are exactly 0.0.  Also, use sub-second resolution if available.
  (Xavier Leroy, report by Christophe Troestler)

- PR#6896: serious reimplementation of Big_int.float_of_big_int and
  Ratio.float_of_ratio, ensuring that the result is correctly rounded.
  (Xavier Leroy)

- PR#6989: in Str library, make sure that all \(...\) groups are binding
    and can be consulted with Str.matched_group.  There used to be
    a limitation to 32 binding groups.
  (Xavier Leroy)

- PR#7013: spurious wake-up in the Event module
  (Xavier Leroy)

- PR#7024: in documentation of Str regular expressions, clarify what
    "end of line" means for "^" and "$" regexps.
  (Xavier Leroy, question by Fredrik Lindgren)


- GPR#286: add support for module aliases
  (Jacques Garrigue)


- GPR#302: The OCaml reference manual is now included in the manual/
  subdirectory of the main OCaml source repository. Contributions to
  the manual are warmly welcome.
  (François Bobot, review by Florian Angeletti)

- PR#6676: ongoing simplification of the "Language Extensions" section
  (Alain Frisch, John Whitington)

- PR#7092, GPR#379: Add missing documentation for new 4.03 features
  (Florian Angeletti)

- PR#7109, GPR#380: Fix bigarray documentation layout
  (Florian Angeletti, Leo White)

Bug fixes:

- PR#3612: memory leak in bigarray read from file
  (Pierre Chambart, report by Gary Huber)

* PR#4166, PR#6956: force linking when calling external C primitives
  (Jacques Garrigue, reports by Markus Mottl and Christophe Troestler)

* PR#4466, PR#5325: under Windows, concurrent read and write operations
    on the same socket could block unexpectedly.  Fixed by keeping sockets
    in asynchronous mode rather than creating them in synchronous mode.
  (Xavier Leroy)

* PR#4539: change exception string raised when comparing functional values
  May break programs matching on the string argument of Invalid_argument.
  Matching on the string argument of Invalid_argument or Failure is a
  programming mistake: these strings may change in future versions.
  (Nicolas Braud-Santoni, report by Eric Cooper)

- PR#4832: Filling bigarrays may block out runtime
  (Markus Mottl)

- PR#5663: program rejected due to nongeneralizable type variable that
    appears nowhere
  (Jacques Garrigue, report by Stephen Weeks)

- PR#5780: report more informative type names in GADTs error messages
  (Jacques Garrigue, report by Sebastien Furic)

- PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid header
    name clashes
  (Jérôme Vouillon and Adrien Nader and whitequark)

* PR#6081: ocaml now adds script's directory to search path, not current
  (Thomas Leonard and Damien Doligez)

- PR#6108, PR#6802: fail cleanly if dynlink.cma or ocamltoplevel.cma
    are loaded inside the toplevel loop.
  (Xavier Leroy)

- PR#6171: Confusing error message when a type escapes its scope.
  (Jacques Garrigue and Leo White, report by John Whitington)

- PR#6340: Incorrect handling of \r when processing "Windows" source files
  (Damien Doligez, report by David Allsopp)

- PR#6342: Incorrect error message when type constraints differ
  (Alain Frisch, report by Philippe Wang)

* PR#6521: {Bytes,Char,String}.escaped were locale-dependent
  we now escape all non-ASCII-printable instead of a locale-dependent subset.
  (Damien Doligez, report by Jun Furuse)

- PR#6526: ocamllex should not warn on unescaped newline inside comments
  (Damien Doligez, report by user 'dhekir')

- PR#6341: ocamldoc -colorize-code adds spurious <br> tags to <pre> blocks
  (Maxence Guesdon, report by Damien Doligez)

- PR#6560: Wrong failure message for {Int32,Int64,NativeInt}.of_string
  It reported (Failure "int_of_string"), now "Int32.of_string" etc.
  (Maxime Dénès and Gabriel Scherer)

- PR#6648: show_module should indicate its elision
  (Jacques Garrigue, report by Leo White)

- PR#6650: Cty_constr not handled correctly by Subst
  (Jacques Garrigue, report by Leo White)

- PR#6651: Failing component lookup
  (Jacques Garrigue, report by Leo White)

* PR#6664: Crash when finalising lazy values of the wrong type.
  (Damien Doligez)

- PR#6672: Unused variance specification allowed in with constraint
  (Jacques Garrigue, report by Leo White)

- PR#6677: Allow to disable warning 39 (useless "rec") with [@ocaml.warning]
  applied to the first value binding of the would-be "rec" declaration
  (Alain Frisch, report by Jun Furuse)

- PR#6744: Univars can escape through polymorphic variants (partial fix)
  (Jacques Garrigue, report by Leo White)

- PR#6752: Extensible variant types and scope escaping
  A side-effect of the fix is that (ocamlc -i) sometimes reports
  (type-sound) invalid signature, with a type used before its declaration.
  (Jacques Garrigue, report by Maxence Guesdon)

- PR#6762: improve warning 45 in presence of re-exported type definitions
  (Warning 45: open statement shadows the constructor)
  (Alain Frisch, report by Olivier Andrieu)

- PR#6776: Failure to kill the "tick" thread, segfault when exiting the runtime
  (Damien Doligez, report by Thomas Braibant)

- PR#6780: Poor error message for wrong -farch and -ffpu options (ocamlopt, ARM)
  (Xavier Leroy, report by whitequark)

- PR#6805: Duplicated expression in case of hole in a non-failing switch.
  (Luc Maranget)

* PR#6808: the parsing of OCAMLRUNPARAM is too lax
  (Damien Doligez)

- PR#6874: Inefficient code generated for module function arguments
  (Jacques Garrigue, report by Markus Mottl)

- PR#6888: The list command of ocamldebug uses the wrong file
  (Damien Doligez, report by Pierre-Marie Pédrot)

- PR#6897: Bad error message for some pattern matching on extensible variants
  (Alain Frisch, report by Gabriel Radanne)

- PR#6899: Optional parameters and non generalizable type variables
  (Thomas Refis and Leo White)

- PR#6907: Stack overflow printing error in class declaration
  (Jacques Garrigue, report by Ivan Gotovchits)

- PR#6931: Incorrect error message on type error inside record construction
  (Damien Doligez, report by Leo White)

- PR#6938: fix regression on "%047.27{l,L,n}{d,i,x,X,o,u}"
  (Benoît Vaugon, report by Arduino Cascella)

- PR#6944: let module X = Path in … is not typed as a module alias
  (Jacques Garrigue, report by Frédéric Bour)

- PR#6945 and GPR#227: protect Sys and Unix functions against string
    arguments containing the null character '\000'
  (Simon Cruanes and Xavier Leroy, report by Daniel Bünzli)

- PR#6946: Uncaught exception with wrong type for "%ignore"
  (Jacques Garrigue, report by Leo White)

- PR#6954: Infinite loop in type checker with module aliases
  (Jacques Garrigue, report by Mark Mottl)

- PR#6972, GPR#276: 4.02.3 regression on documentation comments in .cmt files
  (Leo White, report by Olivier Andrieu)

- PR#6977: String literals in comments interpret escape sequences
  (Damien Doligez, report by Daniel Bünzli and David Sheets)

- PR#6980: Assert failure from polymorphic variants and existentials
  (Jacques Garrigue, report by Leo White)

- PR#6981: Ctype.Unify(_) with associated functor arg refering to previous one
  (Jacques Garrigue, report by Nicholas Labich)

- PR#6982: unexpected type error when packing a module alias
  (Jacques Garrigue, report by Valentin Gatien-Baron)

- PR#6985: `module type of struct include Bar end exposes
           %s#row when Bar contains private row types
  (Jacques Garrigue, report by Nicholas Labich)

- PR#6992: Segfault from bug in GADT/module typing
  (Jacques Garrigue, report by Stephen Dolan)

- PR#6993: Segfault from recursive modules violating exhaustiveness assumptions
  (Jacques Garrigue, report by Stephen Dolan)

- PR#6998: Typer fails reading unnecessary cmis with -no-alias-deps and -w -49
  (Leo White, report by Valentin Gatien-Baron)

- PR#7003: String.sub may cause segmentation fault on sizes above 2^31
  (Damien Doligez, report by Radek Micek)

- PR#7008: Fatal error in ocamlc with empty compilation unit name
  (Damien Doligez, report by Cesar Kunz)

- PR#7012: Variable name forgotten when it starts with a capital letter
  (Jacques Garrigue, Gabriel Scherer,
   report by Thomas Leonard and Florian Angeletti)

- PR#7016: fix Stack overflow in GADT typing
  Note: Equi-recursive types are considered when checking GADT pattern
  exhaustiveness, even when -rectypes is not used.
  (Jacques Garrigue, report by Mikhail Mandrykin)

- PR#7030: fails to build on SPARC Solaris
  (report and fix by Patrick Star)

- PR#7036: Module alias is not taken into account when checking module
  type compatibility (in a class type)
  (Jacques Garrigue)

- PR#7037: more reproducible builds, don't put temp file names into objects
  (Xavier Leroy)

- PR#7038: out of memory condition in caml_io_mutex_lock
  (Xavier Leroy, report by Marc Lasson)

- PR#7039: Unix.getsockname returns garbage for unnamed PF_UNIX sockets
  (Xavier Leroy)

- PR#7042 and GPR#295: CSE optimization confuses the FP literals +0.0 and -0.0
  (Xavier Leroy)

- PR#7075: Fix repetitions in ocamldoc generated documentation
  (Florian Angeletti)

- PR#7082: Object type in recursive module's `with` annotation
  (Jacques Garrigue and Alain Frisch, report by Nicholas Labich)

- PR#7096: ocamldoc uses an incorrect subscript/superscript style
  (Gabriel Scherer, report by user 'pierpa')

- PR#7108: ocamldoc, have -html preserve custom/extended html generators
  (Armaël Guéneau)

- PR#7111: reject empty let bindings instead of printing incorrect syntax
  (Jérémie Dimino)

* PR#7113: -safe-string can break GADT compatibility check
  bytes and string are now considered compatible even with -safe-string,
  which may break exhaustivity for code assuming they were disjoint
  (Jacques Garrigue, report by Jeremy Yallop)

- PR#7115: shadowing in a branch of a GADT match breaks unused variable warning
  (Alain Frisch, report by Valentin Gatien-Baron)

- PR#7133, GPR#450: generate local jump labels on OS X
  (Bart Jacobs)

- PR#7135: only warn about ground coercions in -principal mode
  (Jacques Garrigue, report by Jeremy Yallop)

- PR#7152: Typing equality involving non-generalizable type variable
  (Jacques Garrigue, report by François Bobot)

- PR#7160: Type synonym definitions can weaken gadt constructor types
  (Jacques Garrigue, report by Mikhail Mandrykin)

- PR#7181: Misleading error message with GADTs and polymorphic variants
  (Jacques Garrigue, report by Pierre Chambart)

- PR#7182: Assertion failure with recursive modules and externals
  (Jacques Garrigue, report by Jeremy Yallop)

- PR#7196: "let open" is not correctly pretty-printed to the left of a ';'
  (Gabriel Scherer, report by Christophe Raffalli)

- GPR#205: Clear caml_backtrace_last_exn before registering as root
  (report and fix by Frederic Bour)

- GPR#220: minor -dsource error on recursive modules
  (Hongbo Zhang)

- GPR#228: fix a dangling internal pointer in (bytecode )debug_info
  (Gabriel Scherer and Mark Shinwell and Xavier Leroy)

- GPR#233: Make CamlinternalMod.init_mod robust to optimization
  (Pierre Chambart, Mark Shinwell)

- GPR#249: fix a few hardcoded ar commands
  (Daniel Bünzli)

- GPR#251: fix cross-compilation with ocamldoc enabled

- GPR#280: Fix stdlib dependencies for .p.cmx
  (Pierre Chambart, Mark Shinwell)

- GPR#283: Fix memory leaks in intern.c when OOM is raised
  (Marc Lasson, review by Alain Frisch)

- GPR#22: Fix the cleaning of weak pointers. In very rare cases
  accessing a value during the cleaning of the weak pointers could
  result in the value being removed from one weak arrays and kept in
  another one. That breaks the property that a value is removed from a
  weak pointer only when it is dead and garbage collected.
  (François Bobot, review by Damien Doligez)

- GPR#313: Prevent quadratic cases in CSE
  (Pierre Chambart, review by Xavier Leroy)

- PR#6795, PR#6996: Make ocamldep report errors passed in
  [%ocaml.error] extension points
  (Jérémie Dimino)

- GPR#355: make ocamlnat build again
  (Jérémie Dimino, Thomas Refis)

- GPR#405: fix compilation under Visual Studio 2015
  (David Allsopp)

- GPR#441: better type error location in presence of type constraints
  (Thomas Refis, report by Arseniy Alekseyev)

- GPR#477: reallow docstrings inside object types, and inside polymorphic
  variant and arrow types
  (Thomas Refis)

Features wishes:

- PR#4518, GPR#29: change location format for reporting errors in ocamldoc
  (Sergei Lebedev)

- PR#4714: List.cons

- PR#5418 (comments) : generate dependencies with $(CC) instead of gcc
  (Damien Doligez, report by Michael Grünewald)

- PR#6167: OCAMLPARAM support for disabling PIC generation ("pic=0")
  (Gabor Pali)

- PR#6367, GPR#25: introduce Asttypes.arg_label to encode labelled arguments
  (Frédéric Bour and Jacques Garrigue)

- PR#6452, GPR#140: add internal suport for custom printing formats
  (Jérémie Dimino)

- PR#6611: remove the option wrapper on optional arguments in the syntax tree
  (Alain Frisch, review by Damien Doligez, request by whitequark)

- PR#6635: support M.[], M.(), M.{< >} and M.[| |]
  (Jeremy Yallop, review by Gabriel Radanne)

- PR#6691: install .cmt[i] files for stdlib and compiler-libs
  (David Sheets, request by Gabriel Radanne)

- PR#6722: compatibility with x32 architecture (x86-64 in ILP32 mode).
  ocamlopt is not supported, but bytecode compiles cleanly.
  (Adam Borowski and Xavier Leroy)

- PR#6742: remove duplicate virtual_flag information from Tstr_class
  (Gabriel Radanne and Jacques Garrigue)

- PR#6719: improve Buffer.add_channel when not enough input is available
  (Simon Cruanes)

* PR#6816: reject integer and float literals directly followed by an identifier.
  This was prevously read as two separate tokens.
  [let abc = 1 in (+) 123abc] was accepted and is now rejected.
  (Hugo Heuzard)

- PR#6876: improve warning 6 by listing the omitted labels.
  (Warning 6: Label omitted in function application)
  (Eyyüb Sari)

- PR#6924: tiny optim to avoid some spilling of floats in x87
  (Alain Frisch)

- GPR#111: `(f [@taillcall]) x y` warns if `f x y` is not a tail-call
  (Simon Cruanes)

- GPR#118: ocamldep -allow-approx: fallback to a lexer-based approximation
  (Frédéric Bour)

- GPR#137: add (in open recursion style) to compiler-libs
  (Gabriel Radanne)

- GPR#142: add a CAMLdrop macro for undoing CAMLparam*/CAMLlocal*
  (Thomas Braibant and Damien Doligez)

- GPR#145: speeedup bigarray access by optimizing Cmmgen.bigarray_indexing
  (Vladimir Brankov, review by Gabriel Scherer)

- GPR#147: [type 'a result = Ok of 'a | Error of 'b] in Pervasives
  (Yaron Minsky)

- GPR#156, GPR#279: optimize caml_frame_descriptors realloc (dynlink speedup)
  (Pierre Chambart, Alain Frisch,
   review by François Bobot, Xavier Leroy and Damien Doligez)

- GPR#165, GPR#221: fix windows compilation warnings
  (Bernhard Schommer, Gabriel Scherer, report by Alain Frisch)

* GPR#170: Parse arbitrary precision integers.
  Accept a single [A-Za-z] as modifier for integers (generalizing 'l','L','n')
  and floats.
  May cause breakage (ie. ppx preprocessor) because of changes in the parsetree.
  This changes PR#6816 a little bit by reading the literal [123a] as a single
  token that can later be rewritten by a ppx preprocessor.
  (Hugo Heuzard)

- GPR#189: Added .dylib and .so as extensions for ocamlmklib
  (Edgar Aroutiounian, whitequark)

- GPR#191: Making gc.h and some part of memory.h public
  (Thomas Refis)

- GPR#196: Make [] and [Thread.self] [noalloc]
  (Clark Gaebel)

- GPR#237: a CONTRIBUTING document
  (François Bobot, Gabriel Scherer, review by Xavier Leroy)

- GPR#245: remove a few remaining French comments
  (Florian Angeletti)

- GPR#252: improve build instructions in MSVC Windows README
  (Philip Daian)

- GPR#308: add experimental support for NetBSD/arm (verified on RaspberryPi)
  (Rich Neswold)

- GPR#335: Type error messages specifies if a type is abstract
  because no corresponding cmi could be found.
  (Hugo Heuzard)

- GPR#365: prevent printing just a single type variable on one side
  of a type error clash.
  (Hugo Heuzard)

- GPR#383: configure: define _ALL_SOURCE for build on AIX7.1

- GPR#401: automatically retry failed test directories in the testsuite
  (David Allsopp)

- GPR#451: an optional 'parallel' target in testsuite/Makefile using the
  GNU parallel tool to run tests in parallel.
  (Gabriel Scherer)

Build system:

- GPR#388: FlexDLL added as a Git submodule and bootstrappable with the compiler
  (David Allsopp)
Goswin von Brederlow asked and François Bobot replied:
>> - GPR#22: Add the Ephemeron module that implements ephemerons and weak
>>    hash table
>>    (François Bobot, review by Damien Doligez, Daniel Bünzli,
>>    Alain Frisch, Pierre Chambart)
> Does that include the discussed documentation and helper functions for
> accessing Weak.t from C bindings?

No, it will not [3]. You should follow the Github pull request [1]
linked in the mantis ticket you opened about this subject [2].

> Note: release notes should warn about Weak.t memory representaion
> being changed and code using it from C breaking.

On the other hand, the warning in the release note will be integrated [1]

Precision for others, there is no breaking if one use the not exported external
function caml_weak_create/get/set. It only breaks if one use the not exported
not documented layout of weak pointers.


qtest 2.2, merged with qcheck


Simon Cruanes announced:
I'm very happy to announce that Qtest, a tool that allows one to write
tests in comments directly next to the tested functions
(originally developed for testing batteries-included), and QCheck, a
quickcheck clone I have been developing for a while, have been merged
in the release qtest-2.2. Qtest provides facilities to write both
unit tests (based on OUnit), as in

  (*$T [1;2;3] = List.sort compare [3;2;1] *)

and quickcheck-like random tests, as in

  (*$Q Q.(list int) (fun l -> sort l = sort (sort l)) *)

The support for random tests now relies upon qcheck. Our goal with this
merge is to provide both a tool for people who want to keep tests as
close as possible to their code (even for versions of OCaml that do not
support ppx), and a feature-full library for people who prefer to keep
their tests separate.

Documentation for qcheck (the library) can be found at .
Documentation for qtest (the tool, and how to use it) can be found at

Note that this release breaks compatibility with the previous versions
of qcheck (mostly because the `'a arbitrary` type is now much richer,
packing together a random generator, a printer, a shrinking
functions…). To upgrade tests from qcheck, it is easy to convert
a random generator into an `'a arbitrary` using `QCheck.make`.

For writing complex generators, Gabriel Scherer's library might be
useful: .

Other OCaml News

From the ocamlcore planet blog:
Here are links from many OCaml blogs aggregated at OCaml Planet,

C++ : Streams



Ocsigen: step by step tutorial for client-server Web application (2/2)

Old cwn

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

Alan Schmitt