X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=pa_goal.ml;h=c95095c78259c34df8c6a0be86a93f777df56d70;hb=2889c9ea611ad4f9a1a3d85c3cf00e951f633304;hp=e7952336b35f3aee1cc0db809aa09ad67165e1f7;hpb=aa32ee4513449868d5c47a31df66a9ffabd26cba;p=goaljobs.git diff --git a/pa_goal.ml b/pa_goal.ml index e795233..c95095c 100644 --- a/pa_goal.ml +++ b/pa_goal.ml @@ -68,6 +68,9 @@ let generate_let_goal _loc (r : rec_flag) (lets : binding) = (* Rename the function to goal_. *) 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,12 @@ 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 + + _enter_goal goalname; + + (* 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 @@ -107,18 +116,21 @@ let generate_let_goal _loc (r : rec_flag) (lets : binding) = $body$ ; _call_onruns (); _call_onsuccesses (); + _leave_goal goalname; (* 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 * ordinary function exit. *) | Goal_result Goal_OK -> + _leave_goal goalname; _call_onsuccesses (); () | exn -> + _leave_goal goalname; _call_onfails exn; raise exn >> in @@ -148,7 +160,7 @@ let generate_let_goal _loc (r : rec_flag) (lets : binding) = let () = publish $str:name$ ( function | [] -> - Goaljobs.require $lid:gname$ + Goaljobs.require $str:name$ $lid:gname$ | _ -> failwith (Printf.sprintf "goal '%s' does not take any arguments" $str:name$); @@ -161,20 +173,23 @@ let generate_let_goal _loc (r : rec_flag) (lets : binding) = * 'expr' is a function call. *) let generate_require _loc expr = - (* Note that 'f a b c' is parsed as '((f a) b) c' so the actually + (* Note that 'f a b c' is parsed as '((f a) b) c' so the actual * function name is buried deeply in the tree. Rewrite the name. *) let rec rewrite = function | ExApp (_loc, ExId (_loc1, IdLid (_loc2, name)), right) -> let gname = "goal_" ^ name in - ExApp (_loc, ExId (_loc1, IdLid (_loc2, gname)), right) + ExApp (_loc, ExId (_loc1, IdLid (_loc2, gname)), right), name + | ExApp (_loc, (ExApp _ as expr), right) -> - ExApp (_loc, rewrite expr, right) + let expr, name = rewrite expr in + ExApp (_loc, expr, right), name + | _ -> locfail _loc "require (...) expression must contain a call to a goal" in - let expr = rewrite expr in - <:expr< Goaljobs.require (fun () -> $expr$) >> + let expr, name = rewrite expr in + <:expr< Goaljobs.require $str:name$ (fun () -> $expr$) >> ;;