View source with raw comments or as raw
    1:- module(scasp_source_reference,
    2          [ scasp_source_reference_file_line/3,   % +Ref, -File, -Line
    3            assert_scasp_source_reference/3,      % +File, +Pos, -Ref
    4            scasp_source_reference/3,             % +Ref, -File, -Pos
    5            scasp_dynamic_clause_position/2       % +Ref, -Pos
    6          ]).

s(CASP) source references

*/

   12scasp_source_reference_file_line(Ref, File, Line) :-
   13    blob(Ref, clause),
   14    !,
   15    (   clause_file_line(Ref, File, Line)
   16    ->  true
   17    ;   File = none, Line = 0
   18    ).
   19scasp_source_reference_file_line(Ref, File, Line) :-
   20    scasp_source_reference(Ref, File, Pos),
   21    !,
   22    (   File == (-)
   23    ->  Line = Pos
   24    ;   stream_position_data(line_count, Pos, Line)
   25    ).
   26
   27clause_file_line(ClauseRef, dynamic, Line) :-
   28    scasp_dynamic_clause_position(ClauseRef, Pos),
   29    !,
   30    stream_position_data(line_count, Pos, Line).
   31clause_file_line(ClauseRef, File, Line) :-
   32    clause_property(ClauseRef, file(File)),
   33    clause_property(ClauseRef, line_count(Line)).
   34
   35:- dynamic scasp_source_reference/3.   36
   37assert_scasp_source_reference(File, Pos, Ref) :-
   38    scasp_source_reference(Ref, File, Pos), !.
   39assert_scasp_source_reference(File, Pos, Ref) :-
   40    (   scasp_source_reference(Ref0, _, _)
   41    ->  Ref is Ref0 + 1
   42    ;   Ref is 1
   43    ),
   44    asserta(scasp_source_reference(Ref, File, Pos)).
 scasp_dynamic_clause_position(+Ref, -Pos) is semidet
True when Pos is the stream position is which the source code for the dynamic clause referenced by Ref was read.
   52:- thread_local scasp_dynamic_clause_position/2.