Hello
Here is the latest OCaml Weekly News, for the week of April 19 to 26, 2016.
Archive: https://sympa.inria.fr/sympa/arc/caml-list/2016-04/msg00056.html
Gregory Malecha asked:I'm wondering if there is any work (and interest) on supporting user-defined optimizations similar to GHC's rewrite rules in the Ocaml compiler. For example, a standard example would be specifying map fusion: map f (map g ls) = map (fun x -> f (g x)) ls This works well in Haskell due to laziness and (mostly) purity but things are obviously more complex in Ocaml since you can not pretend that things are pure (due to exceptions, references, IO, and non-termination). On a related note, this sort of optimization could require a reasonable amount of static analysis for effects (or trying to reflect effects in the type system). Has there been any work related to this?Jonas Jensen replied:
A "boring" and practical answer is that you get this optimization by writing your long chain of map, filter, bind, etc. using Batteries' Enum (http://ocaml-batteries-team.github.io/batteries-included/hdoc2/BatEnum.html) or the stand-alone Gen package (http://cedeela.fr/~simon/software/gen/Gen.S.html). It looks superficially like list map, but the order of execution will be like after a fusion, which should improve cache locality and avoid allocations of intermediate lists.Yaron Minsky added:
Also, Core_kernel's Sequence type fills a similar purpose. And Flambda does a good job of optimizing the iteration in Sequence, from what I've overheard about our experiments.Gregory Malecha replied and Gabriel Scherer said:
> Thanks for the feedback. It sounds like there are reasonable ways to do this > if you write your programs in such a way that everything can be done via > inlining. While I agree that this works in many cases, it doesn't seem > powerful enough to solve everything. For example, equations that are only > provable by induction are not optimizable by this strategy (without some > pretty fancy tricks). > > Do you believe that having a rewriting facility is unnecessary? > Undersireable (it makes the compiler too complex, too slow, too > unpredictable)? Or do you think that it would be useful, but no one has done > anything on it? Another approach that might be worth trying (sorry for not thinking about it earlier) is MetaOCaml. I tend of think of it as a tool to explicitly specify and control partial evaluation strategies. Jeremy Yallop teaches MetaOCaml and some optimization tricks using it. See this excellent IOCaml notebook showing how to optimize a sequence of operations on a simple stack machine using MetaOCaml, which is not far from the discussed application. http://ocamllabs.github.io/iocamljs/staging2.html (I don't have an opinion on effectiveness of user-defined rewriting for OCaml code, I guess one should try to see how it goes. My take-away from the usage in the Haskell community is that it's very useful in some situations but also very fragile.)Daniel Bünzli asked and Ben Millwood replied:
> What kind of fragility ? You can see hints at the problems with rewrite rules by reading about the mechanisms GHC has to work around them: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/pragmas.html#inline-pragma For example, rules can be prevented from matching if some subexpression is inlined first, but on the flipside, some rules need some inlining to occur before they can match. This leads GHC to support "phase specifications" that help you to control the order of inlinings and rules.
Archive: https://sympa.inria.fr/sympa/arc/caml-list/2016-04/msg00075.html
Damien Doligez announced:Dear OCaml users, We have the pleasure of celebrating the birthday of Andrey Kolmogorov by announcing the release of OCaml version 4.03.0. It is available as a bunch of OPAM switches, or as a source download here: < http://caml.inria.fr/pub/distrib/ocaml-4.03/ >. The OPAM switches are: 4.03.0 Official 4.03.0 release 4.03.0+flambda Official 4.03.0 release with flambda enabled 4.03.0+fp Official 4.03.0 release with frame pointers 4.03.0+fp+flambda Official 4.03.0 release with frame pointers and flambda enabled 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 constructors (Alain Frisch) - PR#6714: allow [@@ocaml.warning] on most structure and signature items: values, modules, module types (whitequark) - 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) Compilers: ========== * 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 (whitequark) - 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 ports) - 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 arguments (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 deprecated (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) - PR#7168: Exceeding stack limit in bytecode can lead to a crash. (Jacques-Henri Jourdan) - PR#7232: Strange Pprintast output with ppx_deriving (Damien Doligez, report by Anton Bachin) - 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#212, PR#7226, GPR#542: emit column position in gas assembly `.loc` (Frédéric Bour, Anton Bachin) - 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) - GPR#514, GPR#554: Added several command-line flags to explicitly enable settings that are currently the default: `-alias-deps`, `-app-funct`, `-no-keep-docs`, `-no-keep-locs`, `-no-principal`, `-no-rectypes`, `-no-strict-formats` (Demi Obenour) - GPR#545: use reraise to preserve backtrace on `match .. with exception e -> raise e` (Nicolas Ojeda Bar, review by Gabriel Scherer) 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: {Char,String,Bytes}.{uppercase,lowercase}, {String,Bytes}.{capitalize,uncaptialize} (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 Pervasives.compare 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]) * Pervasives.compare 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#6906: wrong error location for unmatched paren with #use in toplevel (Damien Doligez, report by Kenichi Asai) - 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) - PR#7209: do not run at_exit handlers in [Unix.create_process] and similar functions when the [exec] call fails in the child process (Jérémie Dimino) OCamldep: ========= - GPR#286: add support for module aliases (Jacques Garrigue) Manual: ======= - 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#6601: replace strcpy with caml_strdup in sample code (Christopher Zimmermann) - PR#6676: ongoing simplification of the "Language Extensions" section (Alain Frisch, John Whitington) - PR#6898: Update win32 support documentation of the Unix library (Damien Doligez, report by Daniel Bünzli) - PR#7092, GPR#379: Add missing documentation for new 4.03 features (Florian Angeletti) - PR#7094, GPR#468, GPR#551: add new section 8.5 to document warnings The general idea is to document warnings that may require explanations. Currently documented warnings are: - 52: Fragile constant pattern. - 57: Ambiguous or-pattern variables under guard (Florian Angeletti and Gabriel Scherer) - 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 directory (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: libasmrun_shared.so 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) - PR#7214: Assertion failure in Env.add_gadt_instances (Jacques Garrigue, report by Stephen Dolan) - PR#7220: fix a memory leak when using both threads and exception backtraces (Gabriel Scherer, review by François Bobot, report by Rob Hoes) - PR#7222: Escaped existential type (Jacques Garrigue, report by Florian Angeletti) - PR#7230: Scrutinee discarded in match with only refutation cases (Jacques Garrigue, report by Jeremy Yallop) - PR#7234: Compatibility check wrong for abstract type constructors (Jacques Garrigue, report by Stephen Dolan) - 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 (whitequark) - 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 untypeast.ml (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 [Thread.id] 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 (tkob) - 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) - GPR#555: ensure that register typing constraints are respected at join points in the control flow graph (Mark Shinwell, debugging & test case by Arseniy Alekseyev and Leo White, code review by Xavier Leroy) Build system: ============= - GPR#388: FlexDLL added as a Git submodule and bootstrappable with the compiler (David Allsopp)
Here are links from many OCaml blogs aggregated at OCaml Planet, http://ocaml.org/community/planet/. Full Time: Software Developer (Functional Programming) at Jane Street in New York, NY; London, UK; Hong Kong http://jobs.github.com/positions/0a9333c4-71da-11e0-9ac7-692793c00b45 Oh! Pascal! http://blog.shaynefletcher.org/2016/04/oh-pascal.html
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.