TUPLE: bits { number read-only } { length read-only } ;
C: <bits> bits
-: check-negative-bits ( n -- n )
- dup 0 < [ non-negative-integer-expected ] when ; inline
-
: make-bits ( number -- bits )
- check-negative-bits
+ ensure-non-negative
[ T{ bits f 0 1 } ] [ dup abs log2 1 + <bits> ] if-zero ; inline
M: bits length length>> ; inline
GENERIC: bit-count ( obj -- n )
M: integer bit-count
- dup 0 < [ non-negative-integer-expected ] when (bit-count) ; inline
+ ensure-non-negative (bit-count) ; inline
M: byte-array bit-count
byte-array-bit-count ;
ERROR: non-negative-integer-expected n ;
+: ensure-non-negative ( n -- n )
+ dup 0 < [ non-negative-integer-expected ] when ; inline
+
: <iota> ( n -- iota )
- dup 0 < [ non-negative-integer-expected ] when
- iota boa ; inline
+ ensure-non-negative iota boa ; inline
M: iota length n>> ; inline
M: iota nth-unsafe drop ; inline
normalize-base32 parse-base32 ;
: >base32-crockford ( n -- base32 )
- dup 0 < [ non-negative-integer-expected ] when
+ ensure-non-negative
[ dup 0 > ] [ 32 /mod ALPHABET nth ] "" produce-as nip
[ "0" ] when-empty reverse! ;
:: integer-sqrt ( m -- n )
m [ 0 ] [
- dup 0 < [ non-negative-integer-expected ] when
+ ensure-non-negative
bit-length 1 - 2 /i :> c
1 :> a!
0 :> d!