[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Resuming SRFI-33 discussion

This page is part of the web mail archives of SRFI 33 from before July 7th, 2015. The new archives for SRFI 33 contain all messages, not just those from before July 7th, 2015.



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 <eleberg@xxxxxxxxxxxxxxx>

    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.