Skip to content
Snippets Groups Projects
Commit 087ea609 authored by Richard W.M. Jones's avatar Richard W.M. Jones
Browse files

Implement goalloc.

parent aa32ee45
No related branches found
No related tags found
No related merge requests found
......@@ -193,6 +193,21 @@ would print:
my name is foo
=head2 goalloc
Inside goals, you can use C<goalloc> to get a printable source
location of the goal, ie:
let goal foo () =
printf "%s\n" goalloc
would print:
File "source.ml", line 2, characters 13-71 (end at line 3, character 23)
Note that the actual string format depends on the internal OCaml
function C<Loc.to_string> so it might change in future.
=head2 onfail, onsuccess, onrun
Inside goals you can register function(s) which run if the goal
......
......@@ -68,6 +68,9 @@ let generate_let_goal _loc (r : rec_flag) (lets : binding) =
(* Rename the function to goal_<name>. *)
let gname = "goal_" ^ name in
(* Convert loc to string for goalloc. *)
let goalloc = Loc.to_string _loc in
(* Split the function into parameters and body. *)
let params, body = function_parameters expr in
......@@ -87,6 +90,10 @@ let generate_let_goal _loc (r : rec_flag) (lets : binding) =
let body = <:expr<
(* Define a goal name which the body may use. *)
let goalname = $str:name$ in
(* Source location. *)
let goalloc = $str:goalloc$ in
(* Define onsuccess, onrun, onfail functions that the body may call. *)
let _on, _call_on =
let _on fns f = fns := f :: !fns in
......@@ -109,7 +116,7 @@ let generate_let_goal _loc (r : rec_flag) (lets : binding) =
_call_onsuccesses ();
(* Avoid a compiler warning: *)
ignore (goalname)
ignore (goalname); ignore (goalloc)
with
(* target() within the body may raise Goal_OK meaning that the
* goal should be short-circuited. We return as if it's an
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment