Re.re и sexp.opaque: не может скомпилировать - PullRequest
1 голос
/ 16 апреля 2019

Я не могу успешно скомпилировать следующий код

open Base
open Sexplib.Std
module Myregexp = struct
  type t =
    | Default
    | Regexp of
        { re : (Re.re [@sexp.opaque])
        ; a : int
        }
  [@@deriving sexp]
  let default = Default
end

Связанный файл dune:

(library (name myregexp)
 (libraries base re sexplib) (preprocess (pps ppx_jane ppx_sexp_conv)))

И команда построения: dune build myregexp.a.

Я получаю сообщение об ошибке:

File "myregexp.ml", line 9, characters 16-21:
Error: Unbound value Re.re_of_sexp

Это не должно происходить благодаря выражению [@sexp.opaque] (которое не позволит вернуть форму sexp из Re.re см. janestreet ppx_sexp_conv )

Я использую ocaml-4.07.1.

1 Ответ

1 голос
/ 16 апреля 2019

Похоже, что эта функция еще не выпущена для общественности, вероятно, она будет выпущена как часть v0.13 версии.

Если мы посмотрим на файл README самого последнего на сегодняшний день (апрель 2019 года) пакета ppx_sexp_conv, мы не найдем упоминаний о [@sexp.opaque]

$ opam source ppx_sexp_conv.v0.12.0
$ grep sexp.opaque ppx_sexp_conv.v0.12.0/README.org 
converters, simply apply the qualifier =sexp_opaque= as if it were a
  type foo = int * stuff sexp_opaque [@@deriving sexp]

.видите, только старый sexp_opaque трюк.Так что нам остается использовать его в текущий момент времени, например,

 type t =
    | Default
    | Regexp of
        { re : Re.re sexp_opaque;
        ; a : int
        }

Конструктор типа 'a sexp_opaque определен как 'a sexp_opaque = 'a, за исключением того, что конвертеры sexp будут считать его непрозрачнымэлемент.

Скорее всего, это сломается в будущих выпусках библиотек JS, поэтому я бы предложил вам более многословное, но стабильное решение:

type regex = Re.t
let sexp_of_regex = sexp_of_opaque
let regex_of_sexp = opaque_of_sexp

type t =
  | Default
  | Regexp of
    { re : regex;
    ; a : int
    }
 [@@deriving sexp]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...