[ANN] v0.13 release of Jane Street packages

Dear OCaml developers,

We are pleased to announce the v0.13 release of Jane Street packages!

This release comes with 14 new packages, and a number of fixes and
enhancements. The documentation for this release is available on our
website:

https://ocaml.janestreet.com/ocaml-core/v0.13/doc/

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

Notable changes

  • Changed Base, Core_kernel, and Core functions to raise
    Not_found_s instead of Not_found. Hashtbl.find_exn and
    Map.find_exn now include the key in their error message.

  • Changed Core and Core_kernel to export int comparison rather
    than polymorphic comparison.

  • Removed the ā€œrobustā€ float comparison operators (>., =., ā€¦)
    from the default namespace.

  • Replaced sexp_* types (sexp_list, sexp_option, sexp_opaque,
    ā€¦) with preprocessor attributes ([@sexp.list], [@sexp.option],
    [@sexp.opaque], ā€¦).

  • Changed let%map syntax from let%map.Foo.Let_syntax to
    let%map.Foo.

  • Added to match%optional support for specifying a path, so you can
    write match%optional.Foo foo_option rather than let open Foo.Optional_syntax in match%optional foo_option.

  • Improved Base.Backtrace so that it enables recording of backtraces
    in more situations, specifically when OCAMLRUNPARAM is defined but
    doesnā€™t mention the backtrace flag, b.

  • Added javascript support for Zarith, Bigint, Bignum, and
    Bigdecimal.

  • Changed Hashtbl.create's default size from 128 to 0.

  • Changed Core_kernel.Command so that all commands accept double
    dash flags: --help, --version, and --build-info.

New packages

Deprecations / Removals

Async_kernel:

  • Deprecated monadic ignore functions in favor of ignore_m.

Base:

  • Deleted Array.replace and replace_all functions, which have been
    deprecated since before the last public release.

  • Deprecated Result.ok_unit; use Ok ().

  • Removed the Monad and Applicative interfacesā€™ all_ignore
    function; it was previously deprecated and replaced by all_unit.

  • Removed List.dedup, which has been deprecated since 2017-04.

  • Removed String mutation functions, which have been deprecated in
    favor of Bytes since 2017-10.

  • Deprecated Array.truncate, Obj_array.unsafe_truncate, and
    Uniform_array.unsafe_truncate.

  • Deprecated Sys.argv, which has been superseded by get_argv,
    which is a function, reflecting the fact that argv can change (as
    of OCaml 4.09).

Core_kernel:

  • Removed Core_kernel.Std, which had been deprecated for a year.

  • Deprecated type Command.Spec.param in favor of Command.Param.t.

  • Removed Hashtbl functions that had been deprecated for years.

  • Removed Float.to_string_round_trippable, which has been deprecated
    in favor of to_string since 2017-04.

  • Deprecated Fqueue functions where one should use Fdeque instead:
    bot, bot_exn, and enqueue_top.

  • Deleted Bus.unsubscribes, which will be obviated by a performance
    improvement to Bus.unsubscribe.

Timing_wheel:

  • Removed the alarm_upper_bound function, which has been deprecated
    for 6 months, and superseded by max_allowed_alarm_time.

Moves

Core_kernel:

  • Moved Bounded_int_table to a standalone library.

  • Moved the Pool and Tuple_type modules to a standalone library,
    Tuple_pool.

Async_unix:

  • Moved Unix.Fd.replace into a Private submodule.

Changelog

Async:

  • Added module Expect_test_config_with_unit_expect, an alternative
    to Expect_test_config in which [%expect] has type unit rather
    than unit Deferred.t.

Async_kernel:

  • Exposed type Async_kernel_config.t.

  • Added a public-facing interface to the Async_kernel_scheduler
    module, taking the subset of Async_unix.Scheduler that makes sense
    in Async_kernel.

  • Added to Time_source and Synchronous_time_source and Id
    submodule, so that you can put them in a hash table or map.

  • Added Deferred.Or_error.tag_s function.

  • Added to Require_explicit_timesource deprecations of Date.Today
    and Time.now.

  • Added Synchronous_time_source.length function.

  • Added Synchronous_time_source functions reschedule_at and
    reschedule_after.

  • Optimized Bvar so that its internal identity coercions can be
    inlined.

  • Added Time_source.advance_by_alarms_by function, like
    advance_by_alarms but takes Time_ns.Span.t.

  • Deprecated monadic ignore functions in favor of ignore_m.

  • Renamed Time_source.advance functions as advance_directly.

  • Added to Synchronous_time_source an advance_directly function.

  • Added Throttle.enqueue_exclusive function, which enqueues a job
    that occupies all slots of the throttle.

  • Optimized Pipe.of_list so that it creates one queue rather than
    two.

  • Added to Pipe.t a field, info : Sexp.t, intended to make debug
    messages more useful.

  • Added Pipe.empty function, equivalent to Pipe.of_list [].

Async_rpc_kernel:

  • Improved the error message when a message cannot be sent because it
    is too big, cutting out a lot of noise.

  • Added an expert function that constructs an Rpc.Implementation.t
    directly given just the rpc_tag and version.

  • Added Async_rpc_kernel_stable module.

  • Added type Implementations.on_unknown_rpc.

  • Added State_rpc.client_pushes_back function, like the same
    function in Pipe_rpc.

Async_unix:

  • Changed In_thread.run to not initialize the scheduler.

  • Optimized Unix.mkdir ~p:() to use Core.Unix.mkdir_p rather than
    its own loop, avoiding many calls to In_thread.syscall_exn.

  • Added to Log.Output creation functions an optional argument:
    ?perm:Unix.file_perm.

  • Added function Shutdown.is_shutting_down : unit -> bool.

  • Added to Process.run* functions an optional argument: ?argv0 : string, like Process.create.

  • Added to Unix types socket_domain and socket_type:
    [@@deriving compare, hash].

  • Changed the Async scheduler to clear its epoll setā€™s ready file
    descriptors after it processes them, so that the already-processed
    file descriptors do not misleadingly appear in the schedulerā€™s sexp.

  • Added to Require_explicit_timesource deprecations of
    Time.Ofday.now and Time_ns.Ofday.now.

  • Made In_thread.run's default ?when_finished configurable via a
    ref, so that an application can change the default globally.

  • Moved Unix.Fd.replace into a Private submodule.

  • Improved Socket.sexp_of_t.

  • In Tcp's socket-creation function, removed a call to
    Unix.set_close_on_exec, which is unnecessary because
    Socket.create already does it.

  • Fixed a bug in Reader.transfer where if the reader has no data to
    read and the output Pipe.Writer.t is closed, the returned deferred
    would not be determined.

  • Added support to Writer for using a custom Time_source.t instead
    of the wall clock.

  • Reworked Writer's buffer-age check.

  • Fixed a stack overflow in Writer sexp conversion.

  • Added to Process.run and related functions a ?prog_search_path
    argument.

  • Treat .mlt files as tests, in particular so that Writer uses
    synchronous output.

Base:

  • Added Or_error.tag_s function.

  • Updated Base for OCaml 4.08.

  • Changed Base functions to raise Not_found_s instead of
    Not_found. Hashtbl.find_exn and Map.find_exn now
    include the key in their error message.

  • Optimized Map.update.

  • Deleted Array.replace and replace_all functions, which have been
    deprecated since before the last public release.

  • Deprecated Result.ok_unit; use Ok ().

  • Added Map.fold_symmetric_diff function, which is more efficient
    than symmetric_diff, due to avoiding Sequence.

  • Removed the Monad and Applicative interfacesā€™ all_ignore
    function; it was previously deprecated and replaced by all_unit.

  • Removed List.dedup, which has been deprecated since 2017-04.

  • Added function Map.iteri_until.

  • Removed String mutation functions, which have been deprecated in
    favor of Bytes since 2017-10.

  • Updated Int63.t to use [@@immediate64] attribute.

  • Changed Hashtbl.create's default size from 128 to 0.

  • Added List functions drop_last and drop_last_exn.

  • Added Sequence.equal function.

  • Made Base build with OCaml 4.06.

  • Improved support for Applicative.S2, adding signatures
    (Applicative_infix2, Let_syntax2) and functors
    (Make_let_syntax2, Of_monad2).

  • Added Hash_set.union function.

  • Added Hashtbl functions choose and choose_exn, analogous to
    Set functions of the same name.

  • Added Map.M and Set.M support for [@@deriving equal].

  • Added functions Map.binary_search and Set.binary_search.

  • Deprecated Array.truncate, Obj_array.unsafe_truncate, and
    Uniform_array.unsafe_truncate.

  • Made Field.t_with_perm be [@@unboxed].

  • Added Sys.getenv and getenv_exn.

  • Added Comparable.reverse function, which reverses the ordering of
    a comparison function.

  • Changed Random.State.default to be lazily initialized,
    nondeterministically, when not in test.

  • Deprecated Sys.argv, which has been superseded by get_argv,
    which is a function, reflecting the fact that argv can change (as
    of OCaml 4.09).

  • Added Random functions char and ascii.

  • Added to Comparable.S functions: equal, min, max.

  • Added to Map functions for creating maps from sequences.

  • Fixed Float.box so that it works with flambda.

  • Fixed Map.t_of_sexp and Hashtbl.t_of_sexp so that on failure
    they raise Of_sexp_error, so that sexp loading functions report
    error locations.

  • Added Applicative.S3 interface.

  • Improved Backtrace so that it enables recording of backtraces in
    more situations, specifically when OCAMLRUNPARAM is defined but
    doesnā€™t mention the backtrace flag, b.

  • In Type_equal.Id.to_sexp, eliminated an unnecessary allocation
    when it is partially applied.

  • Added Option_array function unsafe_get_some_assuming_some, which
    is similar to unsafe_get_some_exn, except that it is faster and
    more unsafe because it avoids testing that its argument is Some.

  • Added to Sequence functions converting to and from Caml.Seq.t.

  • Removed from Sequence a vestigial performance hack intended to
    improve partial application.

  • Made List match Invariant.S1.

  • Changed Hashtbl.equal's argument order to match the standard
    order, taking the data equality function first.

  • Made many modules match Invariant.S: Bool, Char, Int, ā€¦

Base_bigstring:

  • Renamed safe, checking binary setters (e.g. set_int8), adding an
    _exn suffix to indicate that they may raise.

  • Fixed a bug in range-checking ~pos and ~len, which could
    overflow when they are large.

  • Added Bigstring.copy function.

  • Marked Bigstring.unsafe_blit as [@@noalloc].

Bignum:

  • Made Bignum match Equal.S.

  • Added javascript support for Zarith, Bigint, Bignum,
    Bigdecimal, and Big_dollars.

  • Added Bigint.Stable.V2 serialization format, which is always
    strictly smaller than the V1 format, and is always the same
    regardless of the architecture.

  • Adding a new serialization format, V3, which makes native and
    javascript serialize things the same way.

Core:

  • Added Unix.Cidr.arg_type.

  • Changed Core to export int comparison rather than polymorphic
    comparison.

  • Optimized Unix.mkdir_p to to create the directories starting from
    the deepest one instead of from the root.

  • Exposed type equality between Time_ns.comparator and
    Time_ns.Stable.V1.comparator.

  • Changed Unix.getnameinfo to raise Not_found_s.

  • Fixed a bug in Unix.mkdir_p, which mistakenly did not use its
    perm argument on the first directory it creates.

  • Added function Linux_ext.Epoll.Expert.clear_ready.

  • Replaced Unix.File_descr's [@@deriving bin_io, sexp] with
    [@@deriving sexp_of]; similarly for Linux_ext.Timer_fd and
    Unix.Process_info.

  • Changed Unix.File_descr.sexp_of_t to elide the file descriptorā€™s
    value when am_running_test.

  • Added Unix.Stable.Signal submodule.

  • Added Sys.override_argv function.

  • In bigstring_stubs.c, switched some uses of free to
    caml_stat_free.

  • Added Iobuf functions length_lo and length_hi.

  • Added Iobuf.memcmp function.

  • Added Iobuf.blit_maximal function.

  • Added to Unix.Cidr a function, broadcast_address, that returns
    the subnetā€™s broadcast address.

  • Add Iobuf expert-only setter functions for each field:
    Expert.set_{buf,lo_min,lo,hi,lo_max}.

  • Added Time and Time_ns functions for converting to and from
    Ofday.Zoned.t.

  • Added Iobuf.fillf_float function, for formatting a float in an
    iobof as specified by a C-style printf format string.

  • Changed the type of Thread.create so that the function to be run
    in the new thread must return unit.

  • Added to Thread.create a required argument on_uncaught_exn:[ `Kill_whole_process | `Print_to_stderr ].

  • Moved Core's time-zone parsing code into its own library,
    Timezone, that depends on Core_kernel.

Core_bench:

  • Made Core_bench stdless.

Core_kernel:

  • Added Core_kernel.eprint_s, like print_s but to stderr.

  • Removed Core_kernel.Std, which had been deprecated for a year.

  • Changed Command so that when command-line parsing fails, it prints
    a more descriptive message explaining how to get usage information.

  • Fixed Command so that for invalid command lines, it prints the
    entire error message on stderr, rather than printing some of it on
    stdout.

  • Made Filename match Comparable.S.

  • Deprecated type Command.Spec.param in favor of Command.Param.t.

  • Changed Core_kernel to export int comparison rather than
    polymorphic comparison.

  • Removed Hashtbl functions that had been deprecated for years.

  • Added support for type t = Map.M(Int).t [@@deriving bin_io] and
    type t = Set.M(Int).t [@@deriving bin_io].

  • Changed Bigbuffer.add_substitute to raise Not_found_s.

  • Moved Bounded_int_table to a standalone library.

  • Changed Command's autocompletion shell functions to disable word
    splitting using an empty string rather than a null byte, which works
    better for zsh.

  • Exposed Date.t as [@@immediate].

  • Added to Hash_queue accessor functions that are polymorphic in the
    key type, making its interface more like Hashtbl and Map.

  • Switched Hash_queue's implementation from custom exceptions to
    raise_s.

  • Added Percent rounding functions: round_significant,
    round_decimal_{mult,percentage,bp}.

  • Added to Time{,_ns}.Ofday.Zoned.With_nonchronological_compare:
    [@@deriving equal].

  • Added Time_ns functions: is_earlier, is_later.

  • Added Bag.S interface.

  • Added Doubly_linked.S] interface.

  • Added Gc.Control.t definition for the new OCaml 4.08 fields.

  • Added Quickcheck bindings to Time and Time_ns.

  • In bigstring_stubs.c, replaced uses of caml_ba_unmap_file with
    calls to the bigstringā€™s finalize function, in preparation for
    OCaml 4.08.

  • Added Or_error.Expect_test_config module.

  • Removed Float.to_string_round_trippable, which has been deprecated
    in favor of to_string since 2017-04.

  • Deprecated Fqueue functions where one should use Fdeque instead:
    bot, bot_exn, and enqueue_top.

  • Changed the definition of Nothing.t from an uninhabited
    Type_equal.t to an empty variant.

  • Moved the Pool and Tuple_type modules to a standalone library,
    Tuple_pool.

  • Added Fdeque and Fqueue functions to convert to and from
    Sequence.

  • Dropped Hash_set.create's unnecessary unit argument.

  • Changed Time_ns functions of_int_ns_since_epoch and
    Span.of_int_ns on on 32-bit platforms so that they work rather
    than always raising.

  • Changed Command.Param.choose_one's ~if_nothing_chosen argument
    from a polymorphic variant to a GADT, and added a constructor that
    makes it return an option.

  • Added Byte_units.zero.

  • Changed Byte_units to use uppercase letters for the unit suffixes.

  • Made Day_of_week derive quickcheck.

  • Added Map functions key_set and of_key_set, for converting
    between a Map.t and the Set.t of its keys.

  • Added Bus.unsubscribes function, for efficient batched
    unsubscription from a bus.

  • Made Percent match Quickcheckable.S.

  • Made String_id.S match Quickcheckable.S.

  • Improved the Quickcheck monad to allow nested let%map syntax.

  • Exported the Intable module.

  • Added Command.Param.and_arg_names, to extract arg names from a
    Command.Param.t.

  • Fixed a bug in Gc.keep_alive that caused it to sometimes not work
    with flambda.

  • Fixed a bug in deserialization of time zones without offsets (GMT,
    UTC).

  • Changed Command.basic to call String.strip on its ?readme
    argument.

  • Exposed Float.Robustly_comparable submodule.

  • Optimized Union_find not allocate in operations where one already
    has a root. This also affects Bag and Doubly_linked.

  • Removed the ā€œrobustā€ float comparison operators (>., =., ā€¦)
    from the default namespace.

  • Improved Command's generated help to clarify that listed and
    one_or_more flags can be repeated.

  • Deleted Bus.unsubscribes, which will be obviated by a performance
    improvement to Bus.unsubscribe.

  • Added Time_ns.Ofday.Option.of_span_since_start_of_day, which will
    return none on an invalid span.

  • Added Blang support for Quickcheckable.S1.

  • In Bus, optimized subscribe_exn and unsubscribe, changing them
    from linear time (in the number of subscribers) to amortized
    constant time.

  • In Bus, relaxed functions that take a 'callback Read_only.t to
    instead take a ('callback, [> read ]) t, which lets us eliminate a
    bunch of pointless calls to Bus.read_only in client code.

  • Added Time_ns functions add_saturating and sub_saturating,
    which clamp rather than overflow.

  • Added Option.Optional_syntax submodule, so that you can use
    ordinary options with immediate options in match%optional.

  • Included Byte_units.Infix operators in the main Byte_units
    module.

  • Changed Command so that all commands accept double dash flags:
    --help, --version, and --build-info.

  • Added Tuple2.map and Tuple3.map functions.

Delimited:

  • Changed Read with ~strip:true to use Char.is_whitespace,
    rather than strip only space characters.

Expect_test_helpers:

  • Generalized the Expect_test_helpers.run functionā€™s ?print_stdout
    and ?print_stderr arguments from type bool to type Print_rule.t = Always | If_unclean_exit | Never.

  • Removed the require_no_allocation functionā€™s ?cr:CR.t argument,
    which was an attractive nuisance.

Incremental:

  • Changed Clock.advance_clock so that it calls
    Timing_wheel.fire_past_alarms, so people donā€™t have to reason
    about [alarm_precision] when thinking about whether alarms have
    fired.

  • Changed Clock.advance_clock so that advancing time backwards is a
    no-op, rather than doing something wrong.

  • Improved Observer.sexp_of_t to show just the observerā€™s value or
    an informative message, omitting a bunch of internal state.

  • Changed Incremental.Clock's default timing-wheel configuration so
    that it handle alarms for all times up to
    Time_ns.max_value_representable.

  • Removed the advance_clock functionā€™s ~deprecated_allow_backwards
    argument.

  • Added map11, ā€¦, map15 functions.

  • Added [@@unboxed] in a couple places to improve performance.

  • Generalized the unordered_array_fold functionā€™s f_inverse
    argument to also allow an update function, which can more
    efficiently implement the composition of f_inverse and f.

  • Generalized step_function to allow the steps to be specified via a
    sequence and to allow the step function to be an incremental value.

  • Made it possible to write functions that deal with incrementals
    without committing to a particular instance of the module created by
    Incremental.Make.

  • Added generic sexp_of_t functions.

  • Added to type state_witness [@@deriving sexp_of].

  • Exposed more equalities between types in Incremental and
    Incremental.S.

  • Added Incremental.state accessor function.

  • Added Incremental.State.create, a generic function for creating an
    incremental state, along with its state_witness type.

Ppx_comapre:

  • Fixed a bug in [@compare.ignore], which generated unannotated
    ignores that were then rejected by ppx_js_style.

Sexp_pretty:

  • Fixed handing of block comments (#| |#).

Stdio:

  • Added Out_channel.eprint_s function.

Timing_wheel:

  • Changed Config.create to trim level_bits as needed according to
    alarm_precision.

  • Fixed Config.durations to not overflow.

  • Added to Level_bits.create_exn an optional argument,
    ?extend_to_max_num_bits:bool, which is useful for extending a
    timing wheelā€™s level bits so that the full range of times is
    covered.

  • Removed the alarm_upper_bound function, which has been deprecated
    for 6 months, and superseded by max_allowed_alarm_time.

  • Changed Timing_wheel's max supported time from:
    Time_ns.max_value_for_1us_rounding to
    Time_ns.max_value_representable.

  • Extended Timing_wheel's supported key bits from 61 to 62, so that
    it supports all Time_ns.t values with alarm_precision = 1ns.

  • Made all Timing_wheel tests run on 32-bit platforms.

Uopt:

  • Added support for match%optional syntax.
12 Likes

I would mention in the Moves section that the Udp module used to be provided in async_extra but was accidentally dropped during the v0.12 release and was too difficult to re-add post-release, after the mistake had been discovered, due to a refactor(?). Glad to see that it returned in its own package. :innocent:

Humble suggestion: any thoughts on fixing internal dev workflow so tests fail if public interfaces are changed (removed)? :innocent::innocent::innocent:

Itā€™s perfectly understandable that Jane Streetā€™s library interfaces will change due to deliberate improvement decisions, but in this case code broke needlessly and there was no obvious recovery.

Will there be a new release of async_ssl? Iā€™m trying to use this but Iā€™m getting errors because async_ssl v0.12 is incompatible with async v0.13

The current master of async_ssl is unfortunately based on
a patch against ctypes. We decided to release all packages
except async_ssl and async_smtp because v0.13 was
already overdue. As soon as async_ssl can be built with a
released ctypes version, we will release async_ssl and
async_smtp v0.13.

Hereā€™s the PR where this issue is being worked on.

Thank you for your continued contributions to the open source OCaml community!

What need does ppx_yojson_conv address which ppx_deriving_yojson didnā€™t? At first glance, I canā€™t see much differences for developers or the end result.

Similarly, Iā€™d love to hear what prompted the creation of postgres_async vs PGX (although young) and PGā€™OCaml (now free of camlp4) which are also pure OCaml implementations.

In both cases we havenā€™t settled on a library yet and any information which could help differentiate them would be very welcome. :slight_smile:

See [ANN] Ppx_yojson_conv: deriving plugin to generate Yojson conversion functions

1 Like

I wanted to try out bonsai, but it seems thereā€™s an issue with the ppx_pattern_bind package. It installs, but then canā€™t be found by dune. Maybe I messed something up?

~/code/ppx_bind_test$ dune build
File "bin/dune", line 4, characters 26-42:
4 |  (libraries ppx_bind_test ppx_pattern_bind))
                              ^^^^^^^^^^^^^^^^
Error: Library "ppx_pattern_bind" not found.
Hint: try: dune external-lib-deps --missing @@default
~/code/ppx_bind_test$ dune external-lib-deps --missing @@default
Error: The following libraries are missing in the default context:
- ppx_pattern_bind
Hint: try: opam install ppx_pattern_bind
~/code/ppx_bind_test$ opam install ppx_pattern_bind
[NOTE] Package ppx_pattern_bind is already installed (current version is v0.13.0).
~/code/ppx_bind_test$ 
1 Like

Met strange problem while trying to install ppx_variants_conv-0.13 in a fresh OCaml 4.09.0 switch (Alpine Linux Docker). Reported a bug at GitHub:

-> installed ppx_variants_conv.v0.13.0

#=== ERROR while installing ppx_variants_conv.v0.13.0 =========================#
opam: "mkdir" failed on /home/user/.opam/4.09.0/.opam-switch/packages/ppx_variants_conv.v0.13.0: No such file or directory


<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
+- The following actions failed
| - build   ppx_assert        v0.13.0
| - build   ppx_custom_printf v0.13.0
| - build   ppx_sexp_message  v0.13.0
| - build   ppx_sexp_value    v0.13.0
| - install ppx_variants_conv v0.13.0
+- 

got the same problem, seems current ppx_pattern_bind (in itā€™s git repos) is buggy, Iā€™ve opened an issue on itā€™s github.

1 Like

There is indeed something weird with ppx_pattern_bind;
in particular the dune file which ended up on github does
not contain a fix we applied days ago to please our internal CI.

We will publish a point release shortly.

I have just re-run the build on Alpine with a 4.09.0 switch,
and cannot reproduce the problem.

Could your problem be a problem with opam?

Hi,

Congrats on releasing. I look forward to use sexp_select!

I have a question regarding compatibility.

When upgrading one of the codebases Iā€™m involved in, the only impacting change was the deprecation of Sys.argv (thatā€™s way easier than the 0.11 -> 0.12 transition). It seems that we have two ways to be compatible with 0.12 and 0.13:

  • suppress the deprecation warning (quickly forgetting about this and wondering why this breaks in 0.14 or when it is removed)
  • use Caml.Sys.argv instead (we went this route)

In that precise case, if there was a new point release that backported Sys.get_argv, it would be possible to stay compatible with both 0.12 and 0.13, while not ā€œdowngradingā€ to the standard lib behavior.

Do you have plans to do this kind of backports, or is the 0.12.x branch ā€œdoneā€?

Thanks!

I am not aware of such plans, but it might be worth dicussing
with Base developers.

1 Like

The following pull request is expected to fix the issue
with ppx_pattern_bind:

1 Like

it builds fine now, also bonsai builds fine, but it miss a version field in the META file, dunno if itā€™s a bug or feature :slight_smile:
THANKS!

1 Like

@xclerc yes, it was unrelated - seems out of space. Sorry about the false alarm.

Also works for me now! Thanks for the help and fast response @phstrauss @xclerc

What has happened to Condition.timedwait? There used to be a Core_condition module in Core, which implemented this function, but it has apparently now disappeared.

It was deleted because a search of the duniverse did not turn up any hits for timedwait, and it was not used at all internally.