package ppx_import

  1. Overview
  2. Docs
A syntax extension for importing declarations from interface files

Install

Dune Dependency

Authors

Maintainers

Sources

ppx_import-1.11.0.tbz
sha256=2667efd48910a1a4e4cb1a31a7d148d0284d112a826a80ec03b0f86546ceac1a
sha512=5259faf2c2d6e617b6ebd67aaec2258859d2438a98007dc7e672325b8bce0303946f781370fb385597e5a8c12f3e5b5f57f8f853fb90aa69fcc8e2111c97347d

Description

Tags

syntax

Published: 16 May 2024

README

[%%import]

import is a syntax extension that allows to pull in types or signatures from other compiled interface files.

Sponsored by Evil Martians.

Installation

import can be installed via OPAM:

$ opam install ppx_import

Usage

In order to use import, require the package ppx_import.

Using ppx_import from Dune

To use ppx_import from Dune you should use the staged_pps field to declare the preprocessing specification. Example:

(library
  (name foo)
  (preprocess (staged_pps ppx_import ppx_deriving.show))

Syntax

Single declarations

For example:

# type loc = [%import: Location.t];;
type loc = Location.t = { loc_start : Lexing.position; loc_end : Lexing.position; loc_ghost : bool; }
# module type Hashable = [%import: (module Hashtbl.HashedType)];;
module type Hashable = sig type t val equal : t -> t -> bool val hash : t -> int end

It is also possible to import items from your own .mli file.

Combining with [@@deriving]

It's possible to combine import and deriving to derive functions for types that you do not own, e.g.:

type longident = [%import: Longident.t] [@@deriving show]
let () =
  print_endline (show_longident (Longident.parse "Foo.Bar.baz"))
(* Longident.Ldot (Longident.Ldot (Longident.Lident ("Foo"), "Bar"), "baz") *)

Note that you need to require import before any deriving plugins, as otherwise deriving will not be able to observe the complete type.

[@with] replacements

It is possible to syntactically replace a type with another while importing a definition. This can be used to import only a few types from a group, or to attach attributes to selected referenced types.

For example, this snippet imports a single type from Parsetree and specifies a custom pretty-printer for deriving show.

type package_type =
[%import: Parsetree.package_type
          [@with core_type    := Parsetree.core_type [@printer Pprintast.core_type];
                 Asttypes.loc := Asttypes.loc [@polyprinter fun pp fmt x -> pp fmt x.Asttypes.txt];
                 Longident.t  := Longident.t [@printer pp_longident]]]
[@@deriving show]

For module types, the replacements are specified using the standard with construct. However, the replacement is still syntactic.

More?

If you have a use case in mind that ppx_import does not cover (in particular, object-oriented features are not implemented), please open an issue.

License

import is distributed under the terms of MIT license.

Dependencies (4)

  1. ppxlib >= "0.26.0"
  2. dune >= "1.11.0"
  3. ocaml >= "4.10.0"
  4. ocaml >= "4.05.0" & < "4.10.0"

Dev Dependencies (3)

  1. ppx_deriving with-test & >= "4.2.1"
  2. ounit with-test
  3. ppx_sexp_conv with-test & >= "v0.13.0"

Used by (16)

  1. coq-lsp >= "0.1.9+8.17"
  2. coq-serapi
  3. elpi >= "1.10.0" & < "1.11.0"
  4. frama-c >= "25.0~beta" & < "29.0~beta"
  5. goblint < "1.1.1"
  6. modelica_ml >= "0.2.0"
  7. octez-l2-libs
  8. pa_ppx < "0.07" | >= "0.10"
  9. ppx_deriving_cmdliner < "0.6.0"
  10. ppx_deriving_morphism
  11. satyrographos >= "0.0.2.13"
  12. systemverilog < "0.0.2"
  13. tezos-scoru-wasm-helpers
  14. uwt < "0.3.3"
  15. vscoq-language-server
  16. wikitext

Conflicts

None

OCaml

Innovation. Community. Security.