Как потребовать модуль на улице Джейн Ocaml
Я работаю через http://dev.realworldocaml.org/records.html и у меня возникли проблемы с требованием
#require "re.posix";;
(* open Base ;;
open Core ;; *)
(* type <record-name> =
{
<field>: <type>;
<field>: <type>;
} *)
type service_info =
{
service_name : string ;
port : int ;
protocol : string ;
}
;;
(* #require "re.postix";; *)
let service_info_of_string line =
let matches =
Re.exec (Re.Posix.compile_pat "([a-zA-Z]+)[\t]+([0-9]+)/([a-zA-Z]+)") line
in
{
service_name = Re.get matches 1;
port = Int.of_string (Re.get matches 2);
protocol = Re.get matches 3;
}
;;
print_endline "foobar"
Это вывод от меня вызова дюны сборки
dune build hello_world.exe
ppx hello_world.pp.ml (exit 1)
(cd _build/default && .ppx/jbuild/ppx_jane/ppx.exe -o hello_world.pp.ml --impl hello_world.ml --dump-ast)
File "hello_world.ml", line 385, characters 0-1:
Error: Syntax error
Вот jbuild
(executable
((name hello_world)
(libraries (core))
(preprocess (pps (ppx_jane)))))
Я обнаружил, что "#use "topfind"работает, если я скомпилирую с ocamlc. Но не смог заставить его работать с дюной.
Советы приветствуются. Спасибо
1 ответ
Следующие исправления сделают ваш пример работоспособным:
open Core ;; (* in particular, it makes Int visible *)
type service_info =
{
service_name : string ;
port : int ;
protocol : string ;
}
;;
(* #require "re.postix";; *)
let service_info_of_string line =
let matches =
Re.exec (Re.Posix.compile_pat "([a-zA-Z]+)[\t]+([0-9]+)/([a-zA-Z]+)") line
in
{
service_name = Re.get matches 1;
port = Int.of_string (Re.get matches 2);
protocol = Re.get matches 3;
}
;;
print_endline "foobar"
А также jbuild
:
(executable
((name hello_world)
(libraries (core re))
(preprocess (pps (ppx_jane)))))