1:- module(bc_walk, [
    2    bc_walk/3
    3]).

Generic term transform */

    7:- meta_predicate(bc_walk(2, *, *)).
 bc_walk(:Handler, +In, -Out) is det
Generic term transformation.
   13% FIXME migrate to separate pack?
   14
   15bc_walk(Handler, In, Out):-
   16    call(Handler, In, Out), !.
   17
   18bc_walk(Handler, In, Out):-
   19    is_list(In), !,
   20    walk_list(In, Handler, Out).
   21
   22bc_walk(Handler, In, Out):-
   23    compound(In), !,
   24    In =.. [Name|Args],
   25    length(Args, Len),
   26    length(ArgsWalked, Len),
   27    Out =.. [Name|ArgsWalked],
   28    walk_list(Args, Handler, ArgsWalked).
   29
   30bc_walk(_, In, In).
   31
   32:- meta_predicate(walk_list(*, 2, *)).   33
   34walk_list([ItemIn|ItemsIn], Handler, [ItemOut|ItemsOut]):-
   35    bc_walk(Handler, ItemIn, ItemOut),
   36    walk_list(ItemsIn, Handler, ItemsOut).
   37
   38walk_list([], _, [])