Re.re和sexp.opaque:无法编译

问题描述 投票:1回答:1

我无法成功编译以下代码

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]声明(这将避免从Re.re返回一个sexp形式,请参阅janestreet ppx_sexp_conv

我正在使用ocaml-4.07.1

ocaml
1个回答
1
投票

看起来这个功能还没有向公众发布,可能它将作为v0.13版本的一部分发布。

如果我们查看最新的README文件(2019年4月)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]
© www.soinside.com 2019 - 2024. All rights reserved.