Resuming SRFI-33 discussion shivers@xxxxxx 08 Apr 2003 07:11 UTC

I have gone over all unresolved issues from the old discussions.
Below, the resolutions. I will send the current draft in a following
message; Francisco can install it in the right place at his convenience.
    -Olin

-------------------------------------------------------------------------------
Summary:
  - NAND & NOR are no longer n-ary. Only associative ops are.
  - Sticking with SIZE/POSITION field specs over FROM/TO.
  - Staying with "op-curry" convention for param order.
  - ANY/ALL lexemes switched to more standard/more-parallel ANY/EVERY for
      ANY-BIT-SET?
      EVERY-BIT-SET?
  - New pair of complementary functions
      BIT-FIELD-ANY? BIT-FIELD-EVERY?
    replaces unbalanced TEST-BIT-FIELD?.
  - "BIT-FIELD" lexeme consistently moved to front of name for
      BIT-FIELD-ANY? BIT-FIELD-EVERY?
      BIT-FIELD-EXTRACT BIT-FIELD-CLEAR
      BIT-FIELD-REPLACE BIT-FIELD-COPY
    (Is everyone agreeable to this?)

-------------------------------------------------------------------------------
    From: Bengt Kleberg <xxxxxx@cbe.ericsson.se>

    i have no objection to the functionality/set of operations offered by
    the "Integer Bitwise-operation Library" by Olin Shivers. instead i
    would like to change function names and argument order to make them
    slightly more reminiscent of the string and vector operations.

    1 would it be possible to change
      arithmetic-shift i count -> exact-integer
    to
      bit-shift-left i count -> exact-integer
      bit-shift-right i count -> exact-integer

This doesn't seem sufficiently compelling to warrant further stewing around.
I'm going to leave things with the traditional "arithmetic shift"
functionality.

    2 would it be possible to change
      bit-set? index i -> boolean
      any-bits-set? test-bits i -> boolean
      all-bits-set? test-bits i -> boolean
      first-set-bit i -> exact-integer
    to
      bit-set? i index -> boolean
      bit-set-any? i test-bits -> boolean
      bit-set-all? i test-bits -> boolean
      bit-set-smallest i -> exact-integer

No, I think this would be a bad idea, since the convention to which you are
suggesting we hew is one that implies we are thus operating on a
data-structure called a "bit set." But we aren't. Sets of bits are a pretty
boring data structure -- there are only four such sets! Rather, we are
checking to see if any bits in a bit string are set.

    3 would it be possible to change
      extract-bit-field size position i -> exact-integer
      test-bit-field?   size position i -> boolean
      clear-bit-field   size position i -> exact-integer
      replace-bit-field size position new-field i -> exact-integer
      copy-bit-field    size position from to     -> exact-integer
    to
      bit-field-extract i size position -> exact-integer
      bit-field-test?   i size position -> boolean
      bit-field-clear   i size position -> exact-integer
      bit-field-replace i size position new-field -> exact-integer
      bit-field-copy   from to size position     -> exact-integer

Your param order issue is the "op-currying" vs. "data-structure accessor"
parameter convention. See below.

Your names seem more in tune with Scheme conventions, so I am converting to
them. If people don't like this, speak up.

    4 i have been unable to find a better name for
      integer-length i -> nonnegative-exact-integer
    but would really like to have a 'bit' prefix here too.

Nothing leaps to mind for me, either. It is the traditional name.
It works fine.

-------------------------------------------------------------------------------
- Are NAND & NOR n-ary?
  I am frankly somewhat divided on this issue.
  Given that Al Petrofsky now supports going with the simple
  associative-ops-are-the-n-ary-ops design heuristic, I have
  gone with this. I don't think it's a big deal, either way.

  I have also just noticed that this split is precisely what
  Common Lisp does.

- SIZE/POSITION vs. FROM/TO
  I went with SIZE/POSITION. Here is the rationale from the SRFI.

  SIZE/POSITION vs. FROM/TO field specs
  Several functions in this library
      extract-bit-field size position i -> integer
      test-bit-field?   size position i -> boolean
      clear-bit-field   size position i -> integer
      replace-bit-field size position new-field i -> integer
      copy-bit-field    size position from to     -> integer
  specify a contiguous "field" of bits in a bitstring. There are two
  conventions we might use to do so:

    - SIZE/POSITION
      E.g., "the 8-bit field beginning at bit 3", and

    - FROM/TO
      E.g., "the field from bit 3 up to, but not including, bit 11", or, perhaps,
            "the field from bit 3 up to bit 10, inclusive."

  FROM/TO specs are conventionally and most usefully "half-open" specs, meaning
  "all i such that FROM <= i and i < TO" -- the FROM index is included and the
  TO index is excluded.

  I have chosen to use SIZE/POSITION instead of FROM/TO for this library.
  Doing so eliminates any possibility of fencepost errors on the TO endpoint.
  It is also the convention chosen by Common Lisp.

  It is not, however, a widely-used convention within Scheme. Most ranges
  in Scheme are specified with half-open intervals of the [from,to) form
  (e.g., (substring s from to)). One might argue that SIZE/POSITION is still
  the right thing for bit fields, as they are, in practice, frequently of fixed
  size, unlike element ranges in strings or vectors.

- ANY/ALL lexemes -> standard ANY/EVERY lexemes
  I have noticed that the ANY-BITS-SET? / ALL-BITS-SET? pair of functions
  do not follow the Scheme naming convention of using ANY and EVERY.
  Also, ALL is a word that pairs with SOME; ANY pairs with EVERY.
  So I have renamed them:
    ANY-BITS-SET? => ANY-BIT-SET?
    ALL-BITS-SET? => EVERY-BIT-SET?
  Notice the "bit-set" lexem is now consistently singular, which is
  both more consistent with other names and grammatically correct.

- TEST-BIT-FIELD? => BIT-FIELD-ANY? BIT-FIELD-EVERY?
  TEST-BIT-FIELD tests for *any* bit in the field being set; it should be
  complemented with a function to test for *all* bits in the field being
  set. So I have replaced it with the pair of functions
    BIT-FIELD-ANY?
    BIT-FIELD-EVERY?
  Note that you can also check for any/every bit in the field being clear,
  as well, by negating these functions.

  This name choice is also closer to Bengt's preferred choices.