math.bits: Clarify docs. Don't support negative numbers for make-bits. Fixes #893.
							parent
							
								
									9b91d78dc4
								
							
						
					
					
						commit
						6b9c7c6772
					
				| 
						 | 
				
			
			@ -22,12 +22,12 @@ HELP: <bits>
 | 
			
		|||
 | 
			
		||||
HELP: make-bits
 | 
			
		||||
{ $values { "number" integer } { "bits" bits } }
 | 
			
		||||
{ $description "Creates a " { $link bits } " object out of the given number, using its log base 2 as the length. This implies that the last element (unless the number is zero), corresponding to the most significant bit, will be " { $link t } "." }
 | 
			
		||||
{ $description "Creates a sequence of bits " { $link bits } " in ascending significance. Throws an error on negative numbers." }
 | 
			
		||||
{ $examples
 | 
			
		||||
    { $example "USING: math.bits prettyprint arrays ;" "0b1101 make-bits >array ." "{ t f t t }" }
 | 
			
		||||
    { $example "USING: math.bits prettyprint arrays ;" "-3 make-bits >array ." "{ t f }" }
 | 
			
		||||
    { $example "USING: math.bits prettyprint arrays ;" "64 make-bits >array ." "{ f f f f t }" }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
HELP: unbits
 | 
			
		||||
HELP: bits>number
 | 
			
		||||
{ $values { "seq" sequence } { "number" integer } }
 | 
			
		||||
{ $description "Turns a sequence of booleans, of the same format made by the " { $link bits } " class, and calculates the number that it represents as little-endian." } ;
 | 
			
		||||
{ $description "Converts a sequence of booleans into a number." } ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,9 +11,8 @@ IN: math.bits.tests
 | 
			
		|||
[ 6 ] [ 0b111111 make-bits length ] unit-test
 | 
			
		||||
[ 0 ] [ 0 make-bits length ] unit-test
 | 
			
		||||
[ 2 ] [ 3 make-bits length ] unit-test
 | 
			
		||||
[ 2 ] [ -3 make-bits length ] unit-test
 | 
			
		||||
[ 1 ] [ 1 make-bits length ] unit-test
 | 
			
		||||
[ 1 ] [ -1 make-bits length ] unit-test
 | 
			
		||||
[ -3 make-bits length ] [ non-negative-integer-expected? ] must-fail-with
 | 
			
		||||
 | 
			
		||||
! Odd bug
 | 
			
		||||
[ t ] [
 | 
			
		||||
| 
						 | 
				
			
			@ -30,5 +29,5 @@ IN: math.bits.tests
 | 
			
		|||
    1067811677921310779 >bignum make-bits last
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
[ 6 ] [ 6 make-bits unbits ] unit-test
 | 
			
		||||
[ 6 ] [ 6 3 <bits> >array unbits ] unit-test
 | 
			
		||||
[ 6 ] [ 6 make-bits bits>number ] unit-test
 | 
			
		||||
[ 6 ] [ 6 3 <bits> >array bits>number ] unit-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,11 @@ IN: math.bits
 | 
			
		|||
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
 | 
			
		||||
    [ T{ bits f 0 0 } ] [ dup abs log2 1 + <bits> ] if-zero ; inline
 | 
			
		||||
 | 
			
		||||
M: bits length length>> ; inline
 | 
			
		||||
| 
						 | 
				
			
			@ -15,5 +19,5 @@ M: bits nth-unsafe number>> swap bit? ; inline
 | 
			
		|||
 | 
			
		||||
INSTANCE: bits immutable-sequence
 | 
			
		||||
 | 
			
		||||
: unbits ( seq -- number )
 | 
			
		||||
: bits>number ( seq -- number )
 | 
			
		||||
    <reversed> 0 [ [ 1 shift ] dip [ 1 + ] when ] reduce ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue