[RFC] Operators GET, SET and CLEAR for L bits

Jose E. Marchesi jemarch@gnu.org
Wed Jan 28 10:48:18 GMT 2026


> Hello people!
>
> I propose to add the following operators (to apply to L bits) to the
> extended standard prelude:
>
>
>   prio SET = 7, CLEAR = 7;
>
>   op SET = (bits b, int n) bits:
>      if n >= 1 AND n <= bits_width
>      then b OR 2r1 SHL (n-1)
>      else b
>      fi;
>
>   op CLEAR = (bits b, int n) bits:
>      if n >= 1 AND n <= bits_width
>      then b AND NOT (2r1 SHL (n-1))
>      fi;
>
>   prio GET = 4;
>
>   op GET = (bits b, int n) bool:
>      if n >= 1 AND n <= bits_width
>      then ABS (b AND n) /= 0
>      fi;

Note GET is not needed, because the standard operator ELEM does exactly
that:

   flags ELEM flag_with


but it counts from the left! i.e. it gives you the boolean corresponding
to the ith boolean starting from the left :)

Also I now realize we still have to implement the bitspack standard
procedures..

>
> Usage example:
>
>   pub mode Termios = struct (bits iflag, lflag, oflag);
>
>   pub int flag_igncr  = 1, { Input flags }
>           flag_icrnl  = 2,
>           flag_ixon   = 3,
>           flag_ignbrk = 4,
>           flag_parmrk = 5,
>           flag_brkint = 6,
>           flag_istrip = 7,
>           flag_inlcr  = 8,
>           flag_opost  = 1, { Output flags }
>           flag_echo   = 1, { Local flags }
>           flag_echonl = 2,
>           flag_icanon = 3,
>           flag_isig   = 4,
>           flag_iexten = 5;
>
>   [...]
>
>   pub proc term_raw_mode = (ref Term t) void:
>   begin
>         bool ret;
>
>         if Termios termios;
>            ret := tcgetattr(ofd of t, termios)
>         then
>              iflag of termios := iflag of termios
>                                  SET flag_ignbrk
>                                  SET flag_brkint
>                                  SET flag_parmrk
>                                  SET flag_istrip
>                                  SET flag_inlcr
>                                  SET flag_igncr
>                                  SET flag_icrnl
>                                  SET flag_ixon;
>              oflag of termios := oflag of termios
>                                  CLEAR flag_opost;
>              lflag of termios := lflag of termios
>                                  CLEAR flag_echo
>                                  CLEAR flag_echonl
>                                  CLEAR flag_icanon
>                                  CLEAR flag_isig
>                                  CLEAR flag_iexten;
>              ret := tcsetattr(ofd of t, termios)
>         fi;
>
>         if NOT ret
>         then term_error("error switching terminal to raw mode: "
>                         + strerror(errno))
>         fi
>   end;
>
> Opinions?
>
> In particular we have to choose some priorities that really make sense
> for these operators.
>
> I am bad with priorities... :(


More information about the Algol68 mailing list