[cwn] Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt alan.schmitt at polytechnique.org
Tue Mar 19 00:53:23 PDT 2019


Hello

Here is the latest OCaml Weekly News, for the week of March 12 to 
19,
2019.

Table of Contents
─────────────────

IMPORTANT: Switching from Mantis to GitHub issues on March 14th
GSoC project on Coccinelle
v0.12 release of Jane Street packages
Logical: logic programming framework inspired by microKanren 
(0.1.0)
Other OCaml News
Old CWN


IMPORTANT: Switching from Mantis to GitHub issues on March 14th
═══════════════════════════════════════════════════════════════

  Archive:
  <https://sympa.inria.fr/sympa/arc/caml-list/2019-03/msg00045.html>


Continuing this thread from last week, Nicolás Ojeda Bär announced
──────────────────────────────────────────────────────────────────

  Thank you for your patience. The migration of the OCaml bug 
  tracker is
  now complete.  If you need to report a bug, please do so at

  <https://github.com/ocaml/ocaml/issues>

  Note that some of the oldest Mantis issues had to be renumbered. 
  You
  can see the full list of renumbered issues here:

  <https://github.com/ocaml/ocaml/blob/trunk/tools/mantis2gh_stripped.csv>

  In the coming days, redirections will be put in place so that 
  the old
  Mantis URLs will point to the new GitHub ones.

  Happy bug reporting!


GSoC project on Coccinelle
══════════════════════════

  Archive:
  <https://sympa.inria.fr/sympa/arc/caml-list/2019-03/msg00048.html>


Julia Lawall announced
──────────────────────

  Coccinelle is a C code matching and transformation tool written 
  in
  OCaml.  A GSoC project is available on improving the 
  implementation of
  Coccinelle, under the umbrella of the Linux Foundation:

  <https://wiki.linuxfoundation.org/gsoc/2019-gsoc-safety-critical-linux>


v0.12 release of Jane Street packages
═════════════════════════════════════

  Archive:
  <https://discuss.ocaml.org/t/ann-v0-12-release-of-jane-street-packages/3499/1>


Xavier Clerc announced
──────────────────────

  We are happy to announce the v0.12 release of Jane Street 
  packages!

  This release comes with a lot of changes, as we ship 19 new 
  packages,
  and have enhanced and refactored a number of existing ones. The
  documentation for this release is available on our website:

  <https://ocaml.janestreet.com/ocaml-core/v0.12/doc/>

  The remainder of this mail highlights the main changes since the 
  v0.11
  release; we hope it will be useful to developers in the process 
  of
  migrating to the new version. A comprehensive change log is 
  available
  at the end.


Comparison and Equality
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

  • The `~cmp' argument used to pass a comparison function has 
  been
    renamed to `~compare'.
  • The `~equal' label of functions `List.equal' and `Array.equal' 
  has
    been removed.


New packages
╌╌╌╌╌╌╌╌╌╌╌╌

  • base_bigstring 
  (<https://github.com/janestreet/base_bigstring>):
    String type based on Bigarray, for use in I/O and C-bindings.
  • base_quickcheck 
  (<https://github.com/janestreet/base_quickcheck>):
    Randomized testing framework, designed for compatibility with 
    Base.
  • hardcaml (<https://github.com/janestreet/hardcaml>): Hardcaml 
  is an
    OCaml library for designing hardware.
  • hardcaml_waveterm
    (<https://github.com/janestreet/hardcaml_waveterm>): A 
    terminal
    based digital waveform viewer for Hardcaml.
  • incr_dom_keyboard
    (<https://github.com/janestreet/incr_dom_keyboard>): A 
    terminal
    based digital waveform viewer for Hardcaml.
  • incr_dom_partial_render
    (<https://github.com/janestreet/incr_dom_partial_render>): A 
    library
    for simplifying rendering of large amounts of data.
  • jst-config (<https://github.com/janestreet/jst-config>):
    Compile-time configuration for Jane Street libraries.
  • netsnmp (<https://github.com/janestreet/netsnmp>): An 
  interface to
    the Net-SNMP client library.
  • notty_async (<https://github.com/janestreet/notty_async>): An
    interface to the Net-SNMP client library.
  • pam (<https://github.com/janestreet/pam>): OCaml bindings for 
  the
    Linux-PAM library.
  • ppx_deriving_hardcaml
    (<https://github.com/janestreet/ppx_deriving_hardcaml>): A 
    plugin
    for the ppx_deriving rewriter that supports the Hardcaml 
    syntax.
  • ppx_module_timer 
  (<https://github.com/janestreet/ppx_module_timer>):
    Ppx rewriter that records top-level module startup times.
  • ppx_stable (<https://github.com/janestreet/ppx_stable>): 
  Stable
    types conversions generator.
  • sexp (<https://github.com/janestreet/sexp>): S-expression 
  swiss
    knife.
  • sexp_diff_kernel 
  (<https://github.com/janestreet/sexp_diff_kernel>):
    Code for computing the diff of two sexps.
  • sexp_macro (<https://github.com/janestreet/sexp_macro>): Sexp
    macros.
  • shell (<https://github.com/janestreet/shell>): Yet another
    implementation of fork&amp;exec and related functionality.
  • time_now (<https://github.com/janestreet/time_now>): Reports 
  the
    current time.
  • zstandard (<https://github.com/janestreet/zstandard>): OCaml
    bindings to Zstandard.


Deprecations
╌╌╌╌╌╌╌╌╌╌╌╌

  `Async':

  • Deprecated `Scheduler.add_busy_poller'.

  `Base':

  • Deprecated `Applicative''s `Args*' module types and 
  `Make_args*'
    functors, which have been superseded by the `let%map' syntax.
  • Deprecated `Array.replace'.

  `Core_kernel':

  • Deprecated `Obj_array', replacing uses with `Uniform_array'.
  • Deprecated the `Timing_wheel_ns.Priority_queue' module, with 
  no
    intended replacement.

  No longer released:

  • `async_extended'.
  • `async_parallel'.
  • `configurator'.
  • `findlib_top'.
  • `incremental_kernel'.
  • `jane-street-tests'.
  • `jenga'.
  • `ppx_ast'.
  • `ppx_core'.
  • `ppx_driver'.
  • `ppx_metaquot'.
  • `ppx_traverse'.
  • `ppx_traverse_builtins'.
  • `ppx_type_conv'.


Moves
╌╌╌╌╌

  `Async':

  • Moved `Weak_hashtbl' module out of `Async' to its own library.
  • Moved `Lock_file' to a single-module library, 
  `Lock_file_async'.
  • Moved `Async_extra.Udp' to a standalone library, `Async_udp'.

  `Async_extended':

  • Moved modules out of `Async_extended' into their own 
  libraries,
    aimed at deleting `Async_extended'.

  `Async_kernel':

  • Moved the `Limiter' module to a single-module library,
    `Limiter_async'.
  • Moved `Eager_deferred' to a standalone library.

  `Async_unix':

  • Moved modules to standalone libraries: `Thread_pool',
    `Thread_safe_ivar', `Thread_safe_pipe'.

  `Base':

  • Moved the `Heap_block' module to `Core_kernel'.
  • Added top-level module `Base.Sign_or_nan', moved out of 
  `Float'
  • Added `Stack' module, moved in from `Core_kernel'.
  • Added `Base.Bigstring' module, moving in most of
    `Core_kernel.Bigstring'.
  • Added the `Base_bigstring' library, splitting out the 
  `Bigstring'
    module from `Base'.

  `Core':

  • Moved some modules out of `Core' to their own library: `Crc',
    `Piecewise_linear', `Syslog', `Timing_wheel_float', 
    `Weak_hashtbl'.
  • Moved modules `Schedule_v4_deprecated' and `Schedule_v5' out 
  of
    `Core' and to their own libraries.
  • Moved the `Daemon' module, to a single-module library.
  • Moved the `Uuid' module out of `Core', to a single-module 
  library.
  • Moved `Lock_file' to a single-module library, 
  `Lock_file_blocking'.
  • Moved the `Mac_address' module out of `Core', to a 
  single-module
    library.
  • Moved modules out to standalone libraries: `Nano_mutex', 
  `Squeue'.

  `Core_kernel':

  • Added `Time_ns.Ofday' submodule, moved from `Core'.
  • Moved module `Unpack_buffer' out of `Core_kernel' and into its 
  own
    library.
  • Moved the implementation of `Quickcheck' into its own library,
    `Base_quickcheck'.
  • Moved the `Limiter' module to a single-module library.
  • Moved the `Bucket' module out to a single-module library.
  • Split out a `Config_h' library for generating the `config.h' 
  file
    that many libraries (including `Core_kernel') use.
  • Moved the `Weak_pointer' module to a standalone library.
  • Moved modules out to standalone libraries: `Force_once',
    `Hash_heap', `Int_set', `Rope', `Thread_safe_queue', 
    `Total_map',
    `Weak_array'.

  `Incremental':

  • Made `Incremental' be the library name rather than
    `Incremental_lib', and moved all modules from 
    `Incremental_lib' to
    submodules of `Incremental'.
  • Merged the `Incremental' and `Incremental_kernel' libraries 
  into a
    single library, `Incremental'.
  • Moved the `Balanced_reducer' module out of `Incremental', to a
    single-module library.

  `Sexplib':

  • Moved `Sexplib.Macro' to its own library `Sexp_macro'.

  `ppx':

  • `ppx_ast', `ppx_core', `ppx_driver', `ppx_metaquot', 
  `ppx_traverse',
    `ppx_traverse_builtins', and `ppx_type_conv' have been merged 
    into
    ppxlib (<https://github.com/ocaml-ppx/ppxlib>).


Changelog
╌╌╌╌╌╌╌╌╌

  `Async':

  • Improved Async scheduler fairness by calling `Thread.yield' 
  every
    cycle, which releases the OCaml lock if any other OCaml 
    threads are
    waiting to acquire it.
  • Renamed `Pipe.merge''s `~cmp' argument as `~compare'.
  • In `Async_rpc', fixed a couple places that had assumed that 
  bin-prot
    writers raise `Buffer_short' when out of space, which isn't 
    always
    the case; instead used a wildcard match.
  • Increased `Unix.listen''s default `backlog' from 10 to 64, to 
  reduce
    occurrences of TCP clients getting `Unexpected EOF' errors 
    when the
    listening server is busy.
  • Added an optional argument to `Pipe' functions `fold' and 
  `iter' so
    they can consider a value flushed when it is processed by the
    supplied `~f' rather than when it is read out of the pipe.
  • Added function 
  `Tcp.Server.close_finished_and_handlers_determined'.
  • Moved `Weak_hashtbl' module out of `Async' to its own library.
  • Changed `Time_source' so that it fires alarms that were added 
  at the
    same time in the order they were added.
  • Added `Writer' submodule `Backing_out_channel', which can be 
  used to
    redirect and collect a writer's output.
  • Optimized a comparison in the Async scheduler's 
  time-stamp-counter
    calibration to use an immediate comparison rather than
    `caml_int_compare'.
  • Moved `Async_unix' tests from the `src' directory to the 
  `test'
    directory.
  • Added to `Log.Output.stdout' and `stderr' functions an 
  optional
    argument, `?format:Format.t'.
  • Added function `Log.Output.filter_to_level', which gives a new 
  log
    output that filters out messages more verbose than the 
    specified
    level.
  • Optimized some code in the Async scheduler to make better use 
  of the
    instruction cache.
  • Added to `Monitor.protect' an optional argument, `?extract_exn 
  :
    bool'.
  • Removed from the `Async_unix' library a top-level effect that 
  set
    `Async_kernel_config.task_id'; instead set `task_id' when the 
    Async
    scheduler is started.
  • Removed `Writer.write_marshal', moving it to the one place 
  where it
    was used, `Async_parallel_deprecated'.
  • Added to `Synchronous_time_source.Event' the ability to create
    unscheduled events and to re-use of unscheduled events or 
    events
    that have happened or been aborted.
  • Added function `Writer.use_synchronous_stdout_and_stderr', 
  which
    causes all subsequent writes to stdout and stderr to occur
    synchronously.
  • Moved `Lock_file' to a single-module library, 
  `Lock_file_async'.
  • Added function
    `Synchronous_time_source.Event.schedule_at_intervals'.
  • Opted in to `ocamlformat'.
  • Added support for configuring the cpu affinity of Async's 
  thread
    pool.
  • Refactored `Unix.wait''s implementation so that one can call 
  `wait'
    but have it *not* install a `SIGCHLD' handler.
  • Added `Rpc' client function that exposes the 
  `Socket.Address.t' of
    the RPC server connected to.
  • In `Reader.load_sexp*' functions, removed the 
  `?expand_macros:bool'
    argument, moving that functionality to the `Sexp_macro' 
    library.
  • Fixed a bug in `Tcp' that was causing `SO_REUSEADDR' to always 
  be
    set.
  • Changed `Unix.Passwd' functions to stop using `In_thread.run', 
  which
    was pointless because the underlying C code doesn't release 
    the
    OCaml lock.
  • Added function `Scheduler.total_cycle_time : unit ->
    Time_ns.Span.t', which returns the total wall-clock time spent
    running Async cycles.
  • Added to `Time_source.advance_by_alarms' an optional argument,
    `?wait_for:(unit -> unit Deferred.t)', which allows the caller 
    to
    control when `advance_by_alarms' proceeds to the next alarm 
    time.
  • Fixed a potential segfault in `Unix.Group.getby{gid,name}' 
  functions
    by changing them to not us `In_thread.run', which avoids a bug 
    in
    the OCaml stdlib's `getgrgid' C wrapper.
  • Added `Reader' functions that operate on whatever is in the 
  reader's
    buffer already, without performing I/O: `bytes_available',
    `peek_available', `read_available'.
  • Deprecated `Scheduler.add_busy_poller'.
  • Improved the implementation of 
  `Reader.read_one_iobuf_at_a_time' to
    use `Iobuf.Expert.reinitialize_of_bigstring'.
  • Added module `Deferred.Or_error.Expect_test_config'.
  • Removed some noise from `Rpc_transport_low_latency' error 
  messages.
  • Added to the `Log' module convenience functions for logging 
  sexps:
    `raw_s', `info_s', `error_s', `debug_s'.
  • Moved `Async_extra.Udp' to a standalone library, `Async_udp'.
  • Improved error handling in the `Rpc_transport_low_latency' 
  module.

  `Async_extended':

  • Moved modules out of `Async_extended' into their own 
  libraries,
    aimed at deleting `Async_extended'.

  `Async_inotify':

  • Fixed race conditions that caused `Events for an unknown 
  watch'.

  `Async_kernel':

  • Extended the allowed range of the Async scheduler's
    `max_inter_cycle_timeout' to include zero, which can improve 
    latency
    because it causes the scheduler's call to `epoll' to not give 
    up the
    OCaml lock.
  • Moved `Async_kernel' tests from `src' directory to the `test'
    directory, which reduces code size.
  • Exposed `Eager_deferred_or_error.List' submodule.
  • Added function `Pipe.fork', which takes a `Pipe.Reader.t' and
    returns a pair of readers, transferring each of the values 
    from the
    input to both of the output readers.
  • Removed some `Obj.magic' from the implementation of `Ivar' 
  that is
    no longer necessary now that constructors can have inline 
    records.
  • Moved the `Limiter' module to a single-module library,
    `Limiter_async'.
  • Added function `Synchronous_time_source.alarm_upper_bound'.
  • In `Synchronous_time_source', disallowed rescheduling of a
    previously aborted event while it is waiting to run.  This 
    fixes a
    bug that would cause an infinite loop.
  • Changed `Deferred.Memo' to use `Staged.t' to make staging 
  explicit.
  • Improved `Deferred.Memo.general' to not require its key to 
  support
    `t_of_sexp'.
  • Added function `Deferred.Or_error.repeat_until_finished'.
  • Added `Deferred.Result' functions `fail' and `failf'.
  • Moved `Eager_deferred' to a standalone library.
  • Fixed a memory leak in `Pipe.values_available', by having 
  repeated
    calls share the same deferred.
  • Added to `Monitor.protect' an optional argument, `~?run:[~Now 
  |
    ~Schedule]~', like `Monitor.try_with'.
  • Restricted the type of `Deferred.any_unit', changing it from 
  `_ t
    list -> unit t' to `unit t list -> unit t'.

  `Async_rpc_kernel':

  • Added submodule `Versioned_rpc.Both_convert.State_rpc', the 
  only
    conversion-kind and rpc-kind combination missing from 
    versioned
    rpcs.

  `Async_unix':

  • Made Async raise if the creation of the first thread-pool 
  thread
    fails.
  • Improved Async's thread-pool-stuck message.
  • Changed the Async scheduler's implementation of the set of 
  file
    descriptors that need to be updated in the file-descr watcher 
    from a
    list to a `Stack.t'.
  • Changed `Unix.Group' and `Unix.Passwd' functions' 
  implementation to
    use `In_thread.run', since the underlying `Core.Unix' 
    functions have
    been changed to be thread safe and to release the OCaml lock.
  • Moved modules to standalone libraries: `Thread_pool',
    `Thread_safe_ivar', `Thread_safe_pipe'.

  `Base':

  • Removed the `Or_error.Ok' module, which matched the 
  `Container'
    interface.
  • Removed the `Ref' module's support for the `Container' 
  interface.
  • In the `Sequence' module, renamed the labeled argument `cmp' 
  to
    `compare', following the rest of `Base'.
  • Deprecated the `String.copy' function, now that we use
    safestring. `String.copy' is already deprecated in stdlib.
  • Optimized `String' functions (`concat', `sub', and `tr') to
    eliminate unnecessary allocation of the result string.
  • Added `Blit.Make_to_string' functor and `Buffer.To_string'
    submodule, for blitting to a string.
  • Added to the `Applicative.S' interface a map operator, `>>|'.
  • Added functor `Applicative.Make_let_syntax', which generates 
  the
    `Let_syntax' module for use with `let%map'.
  • Added function `List.partition_result : ('ok, 'error) Result.t 
  t ->
    'ok t * 'error t'.
  • Changed `Base.raise' to use the `%raise' primitive, so that 
  the
    compiler can automatically rewrite `%raise' by `%reraise' when
    appropriate.
  • Added `Array' functions `of_list_mapi', `of_rev_list_mapi'.
  • Optimized `Array' looping functions to remove allocation: 
  `exists',
    `find_map', `foldi', `for_all', etc.
  • Added `*_pow2' and `*_log2' functions to `Int_intf.S' and
    implemented them for all integer modules: `floor_pow2', 
    `ceil_pow2',
    `is_pow2', `floor_log2', `ceil_log2'.
  • Moved the `Heap_block' module to `Core_kernel'.
  • Made `List.drop' and `List.drop_while' tail recursive.
  • Optimized `Hash_set.to_array', removing an intermediate list.
  • Optimized `Sign' comparison functions to be the type-specific
    versions, rather than the polymorphic ones.
  • Added top-level module `Base.Sign_or_nan', moved out of 
  `Float'
  • Made `Bool' implement the `Identifiable.S' interface.
  • For `Container''s `sum' function, added the 
  `Container.Summable'
    interface, replacing `Commutative_group'.
  • Improved `Type_equal.Id.sexp_of_t', reducing noise, especially 
  in
    tests.
  • Changed `List.equal' and `Array.equal', removing the `~equal' 
  label
    from their argument.  This makes them like `compare' 
    functions, and
    is in preparation for changing `[@@deriving compare]' to also 
    derive
    equality functions.
  • Changed the type of `List.sort' from `compare:('a -> 'a -> 
  int) ->
    'a t -> 'a t' to `'a t -> compare:('a -> 'a -> int) -> 'a t'.
  • Added `Stack' module, moved in from `Core_kernel'.
  • Deleted the `Applicative.Const' functor.
  • Optimized `Lazy.compare' to immediately return `true' if its
    arguments are `phys_equal'.
  • Deprecated `Applicative''s `Args*' module types and 
  `Make_args*'
    functors, which have been superseded by the `let%map' syntax.
  • Added `Field' functions `map' and `update'.
  • Reworked the type of 
  `Ordered_collection_common.get_pos_len{,_exn}'.
  • Optimized `String.contains', eliminating unnecessary 
  allocation and
    bounds checks.
  • Deprecated `Array.replace'.
  • Added `String.Search_pattern' function `val matches : t -> 
  string ->
    bool'.
  • Optimized `Hashtbl.mapi_inplace', making it up to 4 to 8 times
    faster.
  • Implemented `Queue.of_array' in terms of `Queue.init'.
  • Added `swap' function to `Obj_array', `Option_array', and
    `Uniform_array'.
  • For JavaScript, added a `const' annotation to the appropriate
    JavaScript primitives.
  • Fixed `Int.Hex.of_string' and related functions to not 
  silently
    ignore a suffix of non-hexadecimal garbage.
  • Optimized `Obj_array.set' functions, removing an unnecessary 
  check
    that the array is a float array.
  • Changed `Option_array.value_exn' to generate smaller code.
  • Change `List.zip''s return type from `('a * 'b) list option' 
  to `('a
    * 'b) list List.Or_unequal_lengths.t'.
  • Added to `Or_error.of_exn_result' an optional `?backtrace' 
  argument.
  • Stopped exporting the `Popcount' module, in favor of functions 
  in
    `Int*' modules.
  • Reimplemented `List.take' and `take_while' to avoid allocating 
  an
    extra tuple.
  • Reworked `String''s implementation to not use `Set'.
  • Optimized `Stack.to_array' to not create an intermediate list.
  • Extended the `Container.Make' functor to allow one to supply a
    custom `length' function that supersedes the definition in 
    terms of
    `fold'.
  • Added `Base.Bigstring' module, moving in most of
    `Core_kernel.Bigstring'.
  • Added `[@@deriving equal]' for primitive types (`bool', 
  `char',
    `int', etc.).
  • Optimized `Array.sort', removing some unnecessary allocation,
  • Made `am_testing' be `true' in `.mlt' files.

  `Base_bigstring':

  • Added the `Base_bigstring' library, splitting out the 
  `Bigstring'
    module from `Base'.

  `Bin_prot':

  • Improved the error message for integer-deserialization 
  overflow on
    32-bit platforms.
  • Switched `bin_shape.ml' to using `Base' rather than 
  reimplementing a
    small fragment of it.

  `Core':

  • Changed `Time.Zone.local' to call `Sys.getenv "TZ"' eagerly so 
  that
    modifications to the environment (e.g. modifying `TZ' to 
    change the
    behavior of `strftime') cannot change which time zone is 
    considered
    "local".
  • Added function `Unix.map_file', for memory mapping a file as a 
  big
    array.
  • Added new stable versions for `Time_ns.Span' and `Time.Span', 
  that
    round trip precisely.  Changed the unstable string and sexp 
    format;
    new code can read the old format but old code can *not* read 
    the new
    format.
  • Added `Md5.digest_bigstring' and used it to implement a more
    efficient version of `Md5.digest_bin_prot'.
  • Changed `Command.Spec.Arg_type.comma_separated' to take a 
  required
    argument, `[allow_empty:bool]'.
  • Optimized `Time_stamp_counter.Calibrator.calibrate' to not 
  allocate.
  • Moved some modules out of `Core' to their own library: `Crc',
    `Piecewise_linear', `Syslog', `Timing_wheel_float', 
    `Weak_hashtbl'.
  • Changed `Unix.symlink''s argument labels from `~src' `~dst' to
    `target' and `link_name', matching `Unix.link'.
  • Moved modules `Schedule_v4_deprecated' and `Schedule_v5' out 
  of
    `Core' and to their own libraries.
  • Moved `Core' tests from `src' directory to `test' directory.
  • Extended `Time_stamp_counter''s interface to match 
  `Comparisons.S',
    with implementation as `Int63' comparisons.
  • Made the `Command' module satisfy the `Applicative.Let_syntax'
    interface.
  • Changed `Lock_file''s lock-file format to include the process 
  start
    time, to avoid collisions.  New code can read old lock files 
    but old
    code can not read new lock files, and will report `unknown 
    lock file
    format' if it encounters a stale lock file.
  • Added `Unix.sysconf' value `CLK_TCK'.
  • Added to `Time_ns.Ofday' a `Zoned' submodule, similar to
    `Time.Ofday.Zoned'.
  • Added function `Linux_ext.sched_getaffinity'.
  • Added function `Sys.unsafe_getenv', intended for use in setuid 
  and
    setgid executables.
  • Changed `Command.Arg_type.comma_separated''s `allow_empty' 
  argument
    to be optional, with default `false'.
  • Moved the `Daemon' module, to a single-module library.
  • Renamed some `Iobuf' functions to clarify which ones truncate
    integers.
  • Removed `Core.Std', which has been deprecated for over a year.
  • Added `Core_stable' modules `Bool', `List', `Option', and 
  `Sexp'.
  • Added to `Unix.create_process_env' an optional argument 
  `?argv0 :
    string'.
  • Moved the `Uuid' module out of `Core', to a single-module 
  library.
  • Moved `Lock_file' to a single-module library, 
  `Lock_file_blocking'.
  • Moved the `Mac_address' module out of `Core', to a 
  single-module
    library.
  • Added `Command.Arg_type' values for `Time_ns' analogous to 
  existing
    `Time' ones.
  • Removed some code from `Bigstring' that was duplicative of
    `Core_kernel.Bigstring'.
  • Moved values out of `Command.Arg_type' and into their 
  respective
    modules.  E.g. `Arg_type.file' became `Filename.arg_type'.
  • Added `Iobuf' function `protect_window_and_bounds_1'.
  • Added Thread functions `getaffinity_self_exn' and
    `setaffinity_self_exn'.
  • Added to `Command.run' an optional argument,
    `?verbose_on_parse_error : bool', that controls whether to 
    print a
    line suggesting the user try the `-help' flag when an 
    exception is
    raised while parsing the arguments.
  • Fixed `Command' autocompletion to work for setuid programs;
    executables were failing to notice that completion was being
    requested, and were thus reporting a `missing subcommand' 
    error.
  • Fixed `Time_stamp_counter.Calibrator' to work when time goes
    backwards.
  • Added to `Unix.exec' and `fork_exec' the ability to remove
    environment variables for the new process.
  • Optimized `Iobuf.Peek.char', by adding `[@inline]' 
  annotations.
  • Extended `Command' so that a `help-for-review.org' file can be
    computed with a single call to the executable, rather than a 
    call
    for every subcommand.
  • Changed `Linux_ext.bind_to_interface''s second argument to be 
  an
    ordinary variant type, `Bound_to_interface.t'.
  • Added a test to help us keep `Core''s exports in sync with
    `Core_kernel''s exports.
  • Added to `Unix.create_process_env' an optional parameter,
    `prog_search_path', to control the search path for the program 
    to be
    executed.
  • Eliminated 3ms of program startup time by making
    `Time_stamp_counter' calibration lazy.
  • Added `Linux_ext.Extended_file_attributes' submodule, with 
  wrappers
    for the `getxattr' and `setxattr' syscalls.
  • Made `Time_stamp_counter' functions' calibrator argument 
  required
    instead of optional.
  • Added `Version_util.Version.parse' function, for parsing a 
  single
    `version' line.
  • Moved modules out to standalone libraries: `Nano_mutex', 
  `Squeue'.

  `Core_kernel':

  • Added function `List.zip_with_remainder', which returns both 
  the
    zipped and unzipped elements.
  • Exposed `Map.comparator_s' function, which was previously 
  added to
    `Base.Map'.
  • Added `Time_ns.Ofday' submodule, moved from `Core'.
  • Made `Time_ns.Span' be stringable and sexpable, and added a
    `Stable.V2' submodule, all moved from `Core'.  Deprecated the
    `Alternate_sexp' module.
  • Added `Univ_map.of_alist_exn' function.
  • Optimized `Int63.Replace_polymorphic_compare' to use the 
  `Int63'
    comparisons directly, rather than defined via a functor.
  • Removed from `Time.Ofday''s and `Time_ns.Ofday''s interface
    `Comparable.With_zero'; one shouldn't think of `Ofday' values 
    as
    signed.
  • Renamed `Time.Ofday.to_millisec_string' to 
  `to_millisecond_string',
    for consistency with `Time_ns'.
  • Renamed `Time.Ofday.of_span_since_start_of_day' to
    `of_span_since_start_of_day_exn', for consistency with 
    `Time_ns'.
  • Generalized `Time.Span.randomize' so that `Time_ns' can share 
  its
    implementation.
  • Updated `Time.Span.to_short_string' to render "24h" as "1d", 
  and to
    go down to nanosecond granularity.
  • Fixed a couple of incorrect deprecations in `Substring', on
    `of_string' and `of_bigstring'.
  • Updated `Time_ns.Ofday' to provide `Ofday_intf.S'.
  • Made polymorphic `Hash_set' support `[@@deriving sexp_of]'.
  • Exported `Buffer' module, from `Base'.
  • Moved module `Unpack_buffer' out of `Core_kernel' and into its 
  own
    library.
  • Updated `Quickcheck' generators and observers to have named 
  state
    arguments (PRNG and hash state).
  • Extended `Hashtbl', `Map', and `Set' to support the `Base' 
  style of
    `[@@deriving hash]', e.g. `type t = float Map.M(Int).t 
    [@@deriving
    hash]'.
  • Moved the implementation of `Quickcheck' into its own library,
    `Base_quickcheck'.
  • Added function `Bigstring.memcmp'.
  • Fixed issues in `Bigstring.unsafe_destroy_and_resize' that 
  could
    lead to segfaults.
  • Made `Sequence.t' and `Sequence.Step.t' support `[@@deriving
    bin_io]'.
  • Moved some `Time_ns' functions from Core to Core_kernel: 
  `of_time',
    `to_time', `Span.of_span', `Span.to_span'.
  • Added function `Memo.of_comparable', which uses a module 
  matching
    `Comparable.S_plain' to memoize a function.
  • Changed `Sexp_maybe' to use `Error''s comparison functions 
  rather
    than polymorphic ones.
  • Exported in `Core_kernel' quickcheck bindings for built-in 
  types.
  • Moved the `Limiter' module to a single-module library.
  • Moved the `Bucket' module out to a single-module library.
  • Merged `Core.Md5' into `Core_kernel.Md5'.
  • Added submodule `Unit.Stable.V1'.
  • Added function `Byte_units.to_string_short'.
  • Split out a `Config_h' library for generating the `config.h' 
  file
    that many libraries (including `Core_kernel') use.
  • Added function `Char.gen_uniform_inclusive : t -> t -> t
    Quickcheck.Generator.t'.
  • Added `Filename' module, moving in most of the code from
    `Core.Filename'.
  • Added `Hash_queue' functions `enqueue_front', `enqueue_back',
    `lookup_and_move_to_front'.
  • Added `Command' module, moving in most of `Core.Command'.
  • Removed the `Pooled_hashtbl' module, moving it to a 
  single-module
    library.
  • Improved `Command.choose_one''s error message.
  • Changed module type `Hash_heap.Key' from `Hashtbl.Key' to
    `Hashtbl.Key_plain'.
  • Deprecated `Obj_array', replacing uses with `Uniform_array'.
  • Renamed `Time' submodule `Relative_to_unspecified_zone' as
    `Date_and_ofday'.
  • Deprecated `Timing_wheel_ns' function `alarm_upper_bound', in 
  favor
    of `max_allowed_alarm_time', which is clear about the 
    inclusiveness
    of its bound.
  • Deprecated the `Timing_wheel_ns.Priority_queue' module, with 
  no
    intended replacement.
  • Added `Tuple.Comparable_plain' functor.
  • Added `Command.Param' functions `map_anons' and `map_flag', 
  analogs
    of the corresponding `Spec' functions.
  • Deprecated `Command.Spec.flags_of_args_exn', which isn't used.
  • Deprecated `Command.Spec' functions `const' and `pair', which 
  have
    `Param' counterparts.
  • Added submodule `Map.Stable.Symmetric_diff_element.V1'.
  • Added to `Timing_wheel_ns.create' an optional argument, 
  `?capacity :
    int', for preallocating the underlying pool.
  • Added `Bigstring.memset' function.
  • Made `Date.t' have `[@@deriving typerep]'.
  • Changed the precision of `Time_ns' strings and sexps from 6 
  digits
    to 9 digits.
  • Removed `Timing_wheel_ns.Priority_queue'.
  • Optimized `Memo', removing a closure allocation that had 
  occurred on
    each call to the memoized function.
  • Added `Time_ns' functions `next' and `prev'.
  • Opted in to ocamlformat.
  • Refactored `Command.Path' and renamed some of its functions.
  • Changed `Command.Path' to retain the dirname of executables.
  • Extended `Hash_queue' to support the use of an alternate 
  hash-table
    implementation.
  • Added `Rope' functions `is_prefix' and `to_char_sequence'.
  • Made `String.Stable' match `Stable_containers.Hashable.V1.S'.
  • Added function `Date.week_number_and_year', for the ISO 8601 
  week
    number and week-numbering year.
  • Extended `String_id.Stable.V1' to match
    `Stable_containers.Hashable.V1.S'.
  • Added a test to help us keep `Core_kernel''s exports in sync 
  with
    `Base''s exports.
  • Added to `Doubly_linked' a number of utility functions: `map',
    `filter_map', `filter_inplace', `map_inplace', etc.
  • Added function `Set_once.set_if_none'.
  • Changed `Hash_queue.dequeue*' functions to match then 
  `enqueue*'
    functions, making it clear whether the element is being 
    removed from
    the front or the back.
  • Added `Hash_queue.drop*' functions.
  • Added to `Flags' unstable `bin_io'.
  • Added `[@@deriving equal]' for primitive types (`bool', 
  `char',
    `int', etc.).
  • Added type `Filename.t = string'.
  • Added `Bigstring.Stable' and `Unstable' submodules, removing
    serialization from `Bigstring.t'.
  • Exposed type equality `Flags.Unstable.t = Flags.t'.
  • Moved `Time_ns.now' functionality to a standalone library,
    `Time_now'.
  • Added `Hexdump.Pretty' submodule, which renders strings 
  directly,
    only using hexdump format if necessary.
  • Moved the `Weak_pointer' module to a standalone library.
  • Reworked the `Byte_units' module.
  • Abstracted the heap from `Sequence.merge_all', so it can be 
  used
    with multiple heap implementations.
  • Added to `String_id.S' `[@@deriving equal]'.
  • Made conversions between `Time' and `Time_ns' round as 
  precisely as
    possible rather than to the nearest microsecond.
  • Moved modules out to standalone libraries: `Force_once',
    `Hash_heap', `Int_set', `Rope', `Thread_safe_queue', 
    `Total_map',
    `Weak_array'.

  `Expect_test_helpers':

  • Added `val sexp_style : Sexp_style.t ref', to configure the 
  style
    `print_s' uses to format sexps.
  • Added to `Expect_test_helpers.run' optional arguments 
  `?postprocess
    : (string -> string)', `?print_stdout : bool', and 
    `?print_stderr :
    bool'.
  • Added new library `Expect_test_helpers_base', pulling out code 
  from
    `Expect_test_helpers_kernel' that only needs `Base'.
  • Extended `within_temp_dir' to work when links cross devices, 
  by
    copying the file.

  `Incremental':

  • Switched Incremental's API from using `Time' to using 
  `Time_ns'.
  • Made `Incremental' be the library name rather than
    `Incremental_lib', and moved all modules from 
    `Incremental_lib' to
    submodules of `Incremental'.
  • Merged the `Incremental' and `Incremental_kernel' libraries 
  into a
    single library, `Incremental'.
  • Moved the `Balanced_reducer' module out of `Incremental', to a
    single-module library.
  • Reduced the use of `Obj.magic'.
  • Made the Incremental library's clock handling explicit rather 
  than
    implicit.
  • Added `Incr_result' library, for dealing with values of type 
  `('a,
    'b) Result.t Incr.t'.
  • Deleted the `Implicit_clock' module type and
    `Make_with_implicit_clock' functor, all code having been 
    converted
    to the explicit clock.

  `Re2':

  • Fixed a segfault bug in `Re2' functions `find_all', 
  `find_all_exn',
    `find_first', `find_first_exn'.
  • Changed `Re2.Options' to be a record of all the options, and
    creation functions to take a single `Options.t'.

  `Rpc_parallel':

  • Add support for inline tests to use `Rpc_parallel'.

  `Sexplib':

  • Added to macro templates the ability to refer to other 
  templates and
    variables.
  • Improved error messages when unable to convert a sexp to a 
  value.
  • Moved `Sexplib.Macro' to its own library `Sexp_macro'.
  • Removed a closure allocation from `Sexp.must_escape'.

  `Stdio':

  • Added function `Stdio.print_s', moved in from `Core_kernel'.
  • Added `print_string' function.


Anton Kochkov then said
───────────────────────

  Since you mentioned Hardcaml here, there is an issue/initiative 
  to
  improve the integration between different chip design tools and
  frameworks:
  • <https://github.com/janestreet/hardcaml/issues/3>
  • <https://github.com/SymbiFlow/ideas/issues/19>
  • <https://github.com/HardwareIR/netlistDB>
  • <https://github.com/freechipsproject/firrtl>


Logical: logic programming framework inspired by microKanren 
(0.1.0)
════════════════════════════════════════════════════════════════════

  Archive:
  <https://discuss.ocaml.org/t/ann-logical-logic-programming-framework-inspired-by-microkanren-0-1-0/3503/1>


Tóth Róbert announced
─────────────────────

  > It's only logical. - Spock

  Logical is a minimalistic logic programming, which is
  • Simple implementation with only a few building blocks
  • Easy to understand and use
  • Supports negation free constraint logic programming by using 
  Sets

  It has a pretty decent readme, so if you are interested you 
  should
  visit the [repository].

  The only future improvement, I'm thinking about now is also 
  supporting
  (lazy) sequences in Logical, so negation free constraint system 
  has a
  workable solution for infinit domains with a custom search 
  strategy
  thanks to sequence generation.

  I created this package mainly, because I couldn't find any 
  published
  microkanren based package, evethough there are some unpublished
  implementations. The other reason was that I want to experiment 
  with
  how well can logic programming be used for business logic
  implementation.

  It was my first time using [Esy] for a personal project and it 
  was
  really easy to work with. I can only recommend it for others, 
  because
  it makes the barrier to entry for others really low.

  Links in readable form:
  • <https://github.com/StrykerKKD/Logical>
  • <http://minikanren.org/>
  • <https://esy.sh/>


[repository] <https://github.com/StrykerKKD/Logical>

[Esy] <https://esy.sh/>


gasche then said
────────────────

  You may be interested in [OCanren] which also ports Kanren ideas 
  into
  an OCaml EDSL (Embedded Domain-Specific Language).


[OCanren] <https://github.com/dboulytchev/OCanren>


Tóth Róbert replied
───────────────────

  I looked at Ocanren, but I didn't really try it out, because
  • it's not published on opam
  • seemed a little bit heavy weight compared to what I wanted
  • I also found the examples a little bit too complex for my 
  taste

  I also looked at the other implementation [minikanren-ocaml], 
  which is
  also unfortunately not published on opam.


[minikanren-ocaml] <https://github.com/lightyang/minikanren-ocaml>


Other OCaml News
════════════════

From the ocamlcore planet blog
──────────────────────────────

  Here are links from many OCaml blogs aggregated at [OCaml 
  Planet].

  • [opam 2.0 tips]


[OCaml Planet] <http://ocaml.org/community/planet/>

[opam 2.0 tips] <https://opam.ocaml.org/blog/opam-20-tips/>


Old CWN
═══════

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

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

  [Alan Schmitt]


[send me a message] <mailto:alan.schmitt at polytechnique.org>

[the archive] <http://alan.petitepomme.net/cwn/>

[RSS feed of the archives] 
<http://alan.petitepomme.net/cwn/cwn.rss>

[online] <http://lists.idyll.org/listinfo/caml-news-weekly/>

[Alan Schmitt] <http://alan.petitepomme.net/>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20190319/6e21fd09/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 487 bytes
Desc: not available
URL: <http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20190319/6e21fd09/attachment-0001.pgp>


More information about the caml-news-weekly mailing list