[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