Re: [eclipse-clp-users] line numbers in calling goals

From: Joachim Schimpf <jschimpf_at_...311...>
Date: Wed, 13 Feb 2013 20:13:20 +0000
On 13/02/2013 07:54, Basile Starynkevitch wrote:
> Hello All,
> In C or C++ I would routinely have
>     #define dbgprintf(Fmt,...) do{if(debugging) printf("%s:%d:" Fmt "\n", __FILE__,__LINE__, ##__VA_ARGS__);}while(0)
> and then I would use at many places things like (in file foo.c line 123)
>      dbgprintf("here x=%d", x);
> with an output like
>      foo.c:123: Here x=10
> Is it possible to get the line number of the invoking super-goal in Eclipse Prolog?

Hi Basile,

First, I would agree with Kish in recommending the use of tkeclipse
and its debugger, at least that's what I do for debugging.  I think
it is fairly easy to use and reasonably quick to learn.  You can set
breakpoints with a mouse click, inspect data, etc.

Having said that, I've taken up your little challenge, just to prove
that there is little that can't be done with ECLiPSe ;)

% The predicate that prints the message
dbg_printf(Name,Fmt,Args,File,Line) :-
         ( debug_wanted(Name) ->
             printf(output, "*| %s:%d:%n",[File,Line]),
             printf(output, "*| %a ",[Name]),
             printf(output, Fmt, Args), nl

% Compile-time substitution of dbg_printf/3 with dbg_printf/5
:- inline(dbg_printf/3, expand_dbg/4).
% uncomment next line to remove all dbg_printfs at compile time
%expand_dbg(dbg_printf(_,_,_), true, _, _).
expand_dbg(dbg_printf(Name,Fmt,Args), dbg_printf(Name,Fmt,Args,File,Line),
             OldAnnGoal, _NewAnnGoal) :-
         ( var(OldAnnGoal) ->
             File = 'unknown', Line=0
             % get source position from the annotated source term
             OldAnnGoal = annotated_term{file:File,line:Line}

% example


test :-
         dbg_printf(here, "X=%w", [X]),
         dbg_printf(here, "X=%w", [X]),
         dbg_printf(here, "X=%w", [X]).

And this is what it prints:

[eclipse 2]: test.
*| //C/cygwin/home/jschimpf/SF/Main/Kernel/x86_64_nt/dbg_printf.ecl:27:
*| here X=foo(_159)
*| //C/cygwin/home/jschimpf/SF/Main/Kernel/x86_64_nt/dbg_printf.ecl:29:
*| here X=foo(bar(_179))
*| //C/cygwin/home/jschimpf/SF/Main/Kernel/x86_64_nt/dbg_printf.ecl:31:
*| here X=foo(bar(baz))

Yes (0.00s cpu)

Received on Wed Feb 13 2013 - 20:13:33 CET

This archive was generated by hypermail 2.2.0 : Mon Jul 09 2018 - 02:05:30 CEST