[squeak-dev] The Inbox: Kernel-dtl.639.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Oct 15 13:35:53 UTC 2011
A new version of Kernel was added to project The Inbox:
http://source.squeak.org/inbox/Kernel-dtl.639.mcz
==================== Summary ====================
Name: Kernel-dtl.639
Author: dtl
Time: 15 October 2011, 9:35:19.698 am
UUID: b1253797-d31f-419d-99e5-3d274a1ea82f
Ancestors: Kernel-nice.638
As reported on Pharo list <http://code.google.com/p/pharo/issues/detail?id=4909> number parser does not attempt to interpret fractions.
Fraction readFromString: '1/2' ==> 1
'1/2' asNumber ==> 1
Change parsers to look for $/ (no space) after first numeric input, and if present read additional input as fraction. No attempt is made to ensure integer valued numerator and denominator, instead just permit conversion to float.
See #testFraction tests for expected behavior
With this change:
Number readFrom: '1/2' ==> (1/2)
Number readFrom: '1 / 2' ==> 1
Number readFrom: '2/1.6' ==> 1.25
Number readFrom: '1.6/2' ==> 0.8
Number readFrom: '1.6/3.2' ==> 0.5
Number readFrom: '1.6e3/3.2e2' ==> 5.0
Number readFrom: '13/10/2011' ==> (13/10) "a date is not a number"
=============== Diff against Kernel-nice.638 ===============
Item was removed:
- ----- Method: ExtendedNumberParser>>nextNumber (in category 'parsing-public') -----
- nextNumber
- "main method for reading a number.
- This one can read Float Integer and ScaledDecimal"
-
- | numberOfTrailingZeroInIntegerPart |
- base := 10.
- neg := self peekSignIsMinus.
- integerPart := self nextUnsignedIntegerOrNilBase: base.
- integerPart ifNil: [(sourceStream peekFor: $.)
- ifTrue: [
- "Try .1 syntax"
- ^self readNumberWithoutIntegerPart]
- ifFalse: [
- "This is not a regular number beginning with a digit
- It is time to check for exceptional condition NaN and Infinity"
- ^self readNamedFloatOrFail]].
- numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero.
- (sourceStream peekFor: $r)
- ifTrue: ["<base>r<integer>"
- | oldNeg pos |
- pos := sourceStream position.
- (base := integerPart) < 2
- ifTrue: ["A radix currently need to be greater than 1, ungobble the r and return the integer part"
- sourceStream skip: -1.
- ^neg
- ifTrue: [base negated]
- ifFalse: [base]].
- oldNeg := neg.
- self peekSignIsMinus ifTrue: [neg := neg not].
- integerPart := self nextUnsignedIntegerOrNilBase: base.
- integerPart ifNil: [
- (sourceStream peekFor: $.) ifTrue: [self readNumberWithoutIntegerPartOrNil ifNotNil: [:aNumber | ^aNumber]].
- sourceStream position: pos.
- ^oldNeg
- ifTrue: [base negated]
- ifFalse: [base]].
- numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero].
- ^ (sourceStream peekFor: $.)
- ifTrue: [self readNumberWithFractionPartNumberOfTrailingZeroInIntegerPart: numberOfTrailingZeroInIntegerPart]
- ifFalse: [self makeIntegerOrScaledInteger]!
Item was added:
+ ----- Method: ExtendedNumberParser>>nextNumericPart (in category 'parsing-public') -----
+ nextNumericPart
+ "main method for reading a number.
+ This one can read Float Integer and ScaledDecimal"
+
+ | numberOfTrailingZeroInIntegerPart |
+ base := 10.
+ neg := self peekSignIsMinus.
+ integerPart := self nextUnsignedIntegerOrNilBase: base.
+ integerPart ifNil: [(sourceStream peekFor: $.)
+ ifTrue: [
+ "Try .1 syntax"
+ ^self readNumberWithoutIntegerPart]
+ ifFalse: [
+ "This is not a regular number beginning with a digit
+ It is time to check for exceptional condition NaN and Infinity"
+ ^self readNamedFloatOrFail]].
+ numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero.
+ (sourceStream peekFor: $r)
+ ifTrue: ["<base>r<integer>"
+ | oldNeg pos |
+ pos := sourceStream position.
+ (base := integerPart) < 2
+ ifTrue: ["A radix currently need to be greater than 1, ungobble the r and return the integer part"
+ sourceStream skip: -1.
+ ^neg
+ ifTrue: [base negated]
+ ifFalse: [base]].
+ oldNeg := neg.
+ self peekSignIsMinus ifTrue: [neg := neg not].
+ integerPart := self nextUnsignedIntegerOrNilBase: base.
+ integerPart ifNil: [
+ (sourceStream peekFor: $.) ifTrue: [self readNumberWithoutIntegerPartOrNil ifNotNil: [:aNumber | ^aNumber]].
+ sourceStream position: pos.
+ ^oldNeg
+ ifTrue: [base negated]
+ ifFalse: [base]].
+ numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero].
+ ^ (sourceStream peekFor: $.)
+ ifTrue: [self readNumberWithFractionPartNumberOfTrailingZeroInIntegerPart: numberOfTrailingZeroInIntegerPart]
+ ifFalse: [self makeIntegerOrScaledInteger]!
Item was changed:
----- Method: SqNumberParser>>nextNumber (in category 'parsing-public') -----
nextNumber
"main method for reading a number.
+ This one can read Float Integer ScaledDecimal and Fraction"
- This one can read Float Integer and ScaledDecimal"
+ | num |
+ num := self nextNumericPart.
+ (sourceStream peekFor: $/)
+ ifTrue: [^num / self nextNumericPart]
+ ifFalse: [^num]
+ !
- | numberOfTrailingZeroInIntegerPart |
- base := 10.
- neg := self peekSignIsMinus.
- integerPart := self nextUnsignedIntegerOrNilBase: base.
- integerPart ifNil: [
- "This is not a regular number beginning with a digit
- It is time to check for exceptional condition NaN and Infinity"
- ^self readNamedFloatOrFail].
- numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero.
- (sourceStream peekFor: $r)
- ifTrue: ["<base>r<integer>"
- (base := integerPart) < 2
- ifTrue: [
- sourceStream skip: -1.
- ^ self expected: 'an integer greater than 1 as valid radix'].
- self peekSignIsMinus
- ifTrue: [neg := neg not].
- integerPart := self nextUnsignedIntegerBase: base.
- numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero].
- ^ (sourceStream peekFor: $.)
- ifTrue: [self readNumberWithFractionPartNumberOfTrailingZeroInIntegerPart: numberOfTrailingZeroInIntegerPart]
- ifFalse: [self makeIntegerOrScaledInteger]!
Item was added:
+ ----- Method: SqNumberParser>>nextNumericPart (in category 'parsing-public') -----
+ nextNumericPart
+ "main method for reading a number.
+ This one can read Float Integer and ScaledDecimal"
+
+ | numberOfTrailingZeroInIntegerPart |
+ base := 10.
+ neg := self peekSignIsMinus.
+ integerPart := self nextUnsignedIntegerOrNilBase: base.
+ integerPart ifNil: [
+ "This is not a regular number beginning with a digit
+ It is time to check for exceptional condition NaN and Infinity"
+ ^self readNamedFloatOrFail].
+ numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero.
+ (sourceStream peekFor: $r)
+ ifTrue: ["<base>r<integer>"
+ (base := integerPart) < 2
+ ifTrue: [
+ sourceStream skip: -1.
+ ^ self expected: 'an integer greater than 1 as valid radix'].
+ self peekSignIsMinus
+ ifTrue: [neg := neg not].
+ integerPart := self nextUnsignedIntegerBase: base.
+ numberOfTrailingZeroInIntegerPart := nDigits - lastNonZero].
+ ^ (sourceStream peekFor: $.)
+ ifTrue: [self readNumberWithFractionPartNumberOfTrailingZeroInIntegerPart: numberOfTrailingZeroInIntegerPart]
+ ifFalse: [self makeIntegerOrScaledInteger]!
More information about the Squeak-dev
mailing list
|