[wg-camlp4] How Jane Street uses camlp4
Yaron Minsky
yminsky at janestreet.com
Mon Jan 28 18:29:19 GMT 2013
Let me rattle a few off:
- type-conv style extensions.
These include bin-prot, sexplib, fieldslib, variantslib, pa_compare...
A few things to note about these:
- generators may take argument, like [type t = ... with
typehash(abstract)]. The generator is one that specifies how to
parse the arguments (although they have to be well
parenthesized). In the examples I can think of, either a few
identifiers are accepted or, in a couple of cases, arbitrary
expressions are accepted.
- there can be generators (with optional argument too) on record
field:
type t =
{ a : int with default(2), sexp_drop_if(fun x -> x = 2);
} with sexp
- We also have some that rely only on quotations. The inside of
quotations are usually types, sometimes expressions.
- pa_ounit: this gives a lightweight syntax for unit-testing. You can
write:
TEST = <some expression>
and it does a bunch of camlp4 magic, including capturing the text
and location of the expression, as part of reporting a unit test
failure effectively. A test that runs the code is registered, but
the actual code isn't run except when unit tests are run.
You can also do:
TEST_MODULE = struct ... end
to create a whole module that won't be instantiated except within
the running of a unit test.
- pa_nonrec: this is a small extension that adds the ability to
define a type non-recursively. Thus, you can write:
type t
module M = struct type nonrec t = t list end
rather than the more annoying:
type t
module M = struct type z = t type t = z list end
- pa_pipebang: this converts
<expr1> |! <expr2>
into
<expr2> (expr1)
which is faster than a naively implemented |! operator
- pa_here: this converts the string _here_ to a source-code location.
- pa_custom_printf: If you put ! before a format string, it allows the
use of a spec like "%{<Module>}" in the format string. For example,
using "%{Time}" wraps [Time.to_string] around the appropriate
argument.
It also allows different formats for a given type:
"%{<Module>.<identifier>}" wraps <Module>.Format.<identifier> around
the appropriate argument. For example, "%{Float.pretty}" would wrap
[Float.Format.pretty] around the appropriate argument.
More information about the wg-camlp4
mailing list