I really didn't think this would be so difficult! I have tried for several
hours now to find an elegant solution to my problem: given a 32 bit value,
create a list of atoms that represent the names of those bit positions of
interest.

The problem domain: decoding a Java .class file into a meaningful compound
term because I can.
Well, I thought I could!

I initially started with the idea of using findall/3 to find all solutions
etc. but really didn't get anywhere with that so I went down the more
conventional recursive route

%% these define the bit positions of interest
accflag(0x0001, public).
accflag(0x0010, final).
accflag(0x0020, super).
accflag(0x0200, interface).
accflag(0x0400, abstract).

%% predicate to convert Value into a list of accflag/2 names.
access_flags(Value, Output) :-
mapflags(Value,
 [0x001:public, 0x0010:final,
  0x0020:super, 0x0200:interface,
  0x0400:abstract],
 Output).

mapflags has taken many incarnations!!! None of which made me happy at all
so here is the question: what is the most elegant way to process an input
value and create an output list of atoms for each bit that was set?

Example: access_flags(0x0601, [public,interface,abstract]).

I will continue to try to find my own way but if anybody could show me how
this can be dine with findall/3 I'd be very pleased. It just feels right
that there should be a solution that reads something like "for all
solutions to accflag(Bit, Name) compose a list of Name-s when Value /\ Bit
is true". It mushroomed because as well as checking for the end of loop
condition, which I couldn't decide was best to use either an empty list of
bits (or no more solutions to accflag/2) or if the input Value reaches zero
because then there would be no more bits to test!

AAARGGGGH! Next month will be my 30th year in software and it gets better
every day!
Once again list, thanks!
Sean
:)
_______________________________________________
Users-prolog mailing list
Users-prolog@gnu.org
https://lists.gnu.org/mailman/listinfo/users-prolog

Reply via email to