1%   Package: structures
    2%   Author : Mats Carlsson
    3%   Updated: 18 March 2010
    4%   Purpose: quick and dirty replacement for ECLiPSe's arg-by-name syntax,
    5%            hard-wired for 'visualization' and 'visualizer' only
    6%   Development version, in flux!
    7
    8:- module(structures, [get_struct/2]).    9
   10/***
   11Example usage
   12=============
   13
   14| ?- get_struct(visualization(parent:Parent,tree_stream:Stream), S).
   15S = visualization(_A,_B,_C,_D,_E,_F,_G,Parent,_H,_I,_J,Stream,_K) ? 
   16
   17% source_info
   18| ?- get_struct(visualization, S).
   19S = visualization(_A,_B,_C,_D,_E,_F,_G,_H,_I,_J,_K,_L,_M) ? 
   20
   21Translation from ECLiPSe to SICStus
   22===================================
   23
   24Replace:
   25
   26p(visualization{root:Root,
   27		tree_root:TreeRoot,
   28		output:Dir,
   29		tree_stream:TreeStream,
   30		stream:Stream}):- ...
   31
   32by:
   33
   34p(S) :-
   35	get_struct(visualization(root:Root,
   36				 tree_root:TreeRoot,
   37				 output:Dir,
   38				 tree_stream:TreeStream,
   39				 stream:Stream), S) :-
   40	...
   41
   42
   43% :-export struct(visualization(root,
   44%                               tree_root,
   45%                               output,
   46%                               ignore_fixed,
   47%                               var_arg,
   48%                               name_arg,
   49%                               focus_arg,
   50%                               parent,
   51%                               stream,
   52%                               range_from,
   53%                               range_to,
   54%                               tree_stream,
   55%                               visualizers)).
   56% :-export struct(visualizer(id,
   57%                            type,
   58%                            type_name,
   59%                            previous,
   60%                            display,
   61%                            x,
   62%                            y,
   63%                            group,
   64%                            width,
   65%                            height,
   66%                            min,
   67%                            max)).
   68***/
   69
   70get_struct(Pattern, Term) :-
   71	Pattern =.. [PHead|PTail],
   72	get_struct(PHead, PTail, Term), !.
   73
   74get_struct(visualization, Fields, Term) :-
   75	functor(Term, visualization, 13),
   76	(   foreach(K:V,Fields),
   77	    param(Term)
   78	do  get_field_argno(K, visualization, I),
   79	    arg(I, Term, V)	    
   80	).
   81get_struct(visualizer, Fields, Term) :-
   82	functor(Term, visualizer, 12),
   83	(   foreach(K:V,Fields),
   84	    param(Term)
   85	do  get_field_argno(K, visualizer, I),
   86	    arg(I, Term, V)	    
   87	).
   88
   89get_field_argno(root, visualization, 1).
   90get_field_argno(tree_root, visualization, 2).
   91get_field_argno(output, visualization, 3).
   92get_field_argno(ignore_fixed, visualization, 4).
   93get_field_argno(var_arg, visualization, 5).
   94get_field_argno(name_arg, visualization, 6).
   95get_field_argno(focus_arg, visualization, 7).
   96get_field_argno(parent, visualization, 8).
   97get_field_argno(stream, visualization, 9).
   98get_field_argno(range_from, visualization, 10).
   99get_field_argno(range_to, visualization, 11).
  100get_field_argno(tree_stream, visualization, 12).
  101get_field_argno(visualizers, visualization, 13).
  102get_field_argno(id, visualizer, 1).
  103get_field_argno(type, visualizer, 2).
  104get_field_argno(type_name, visualizer, 3).
  105get_field_argno(previous, visualizer, 4).
  106get_field_argno(display, visualizer, 5).
  107get_field_argno(x, visualizer, 6).
  108get_field_argno(y, visualizer, 7).
  109get_field_argno(group, visualizer, 8).
  110get_field_argno(width, visualizer, 9).
  111get_field_argno(height, visualizer, 10).
  112get_field_argno(min, visualizer, 11).
  113get_field_argno(max, visualizer, 12)