[squeak-dev] The Inbox: Collections-cwp.493.mcz

Levente Uzonyi leves at elte.hu
Thu Oct 25 00:07:35 UTC 2012


On Wed, 24 Oct 2012, commits at source.squeak.org wrote:

> A new version of Collections was added to project The Inbox:
> http://source.squeak.org/inbox/Collections-cwp.493.mcz
>
> ==================== Summary ====================
>
> Name: Collections-cwp.493
> Author: cwp
> Time: 24 October 2012, 2:51:20.618 pm
> UUID: 0c1728e3-2bdf-4f5b-98d8-1a49539bc32c
> Ancestors: Collections-cwp.492
>
> Removed leading- and trailing-keywords support from String>>numArgs. Also extracted the class-specific differences into #canBeToken, so that only String need implement #numArgs.

Thanks, this looks great. Instead of writing a mail about my ideas, I 
decided to push another version to the Inbox.


Levente

>
> =============== Diff against Collections-cwp.492 ===============
>
> Item was added:
> + ----- Method: ByteString>>canBeToken (in category 'testing') -----
> + canBeToken
> + 	"Optimized version for the common case."
> +
> + 	^ (self findSubstring: '~' in: self startingAt: 1 matchTable: Tokenish) = 0
> + 		!
>
> Item was added:
> + ----- Method: String>>canBeToken (in category 'testing') -----
> + canBeToken
> + 	"Extracted from #numArgs to allow specialization by subclasses"
> +
> + 	^ self allSatisfy: [:c | c tokenish]!
>
> Item was changed:
>  ----- Method: String>>numArgs (in category 'accessing') -----
>  numArgs
>  	"Answer either the number of arguments that the receiver would take if considered a selector.  Answer -1 if it couldn't be a selector.  Note that currently this will answer -1 for anything begining with an uppercase letter even though the system will accept such symbols as selectors.  It is intended mostly for the assistance of spelling correction."
>
> + 	| firstChar numColons start ix |
> - 	| firstChar numColons excess start ix |
>  	self size = 0 ifTrue: [^ -1].
>  	firstChar := self at: 1.
> + 	firstChar isLetter ifTrue:
> + 		[self canBeToken ifFalse: [^ -1].
> - 	(firstChar isLetter or: [firstChar = $:]) ifTrue:
> - 		["Fast reject if any chars are non-alphanumeric
> - 		NOTE: fast only for Byte things - Broken for Wide"
> - 		self class isBytes
> - 			ifTrue: [(self findSubstring: '~' in: self startingAt: 1 matchTable: Tokenish) > 0 ifTrue: [^ -1]]
> - 			ifFalse: [2 to: self size do: [:i | (self at: i) tokenish ifFalse: [^ -1]]].
>  		"Fast colon count"
>  		numColons := 0.  start := 1.
> + 		[(ix := self indexOf: $: startingAt: start) > 0] whileTrue:
> + 			[numColons := numColons + 1.
> + 			start := ix + 1].
> + 		^ (numColons > 0 and: [self last ~= $:])
> + 			ifTrue: [^ -1]
> + 			ifFalse: [numColons]].
> - 		[(ix := self indexOf: $: startingAt: start) > 0]
> - 			whileTrue:
> - 				[numColons := numColons + 1.
> - 				start := ix + 1].
> - 		numColons = 0 ifTrue: [^ 0].
> - 		firstChar = $:
> - 			ifTrue: [excess := 2 "Has an initial keyword, as #:if:then:else:"]
> - 			ifFalse: [excess := 0].
> - 		self last = $:
> - 			ifTrue: [^ numColons - excess]
> - 			ifFalse: [^ numColons - excess - 1 "Has a final keywords as #nextPut::andCR"]].
>  	firstChar isSpecial ifTrue:
>  		[self size = 1 ifTrue: [^ 1].
>  		2 to: self size do: [:i | (self at: i) isSpecial ifFalse: [^ -1]].
>  		^ 1].
>  	^ -1.!
>
> Item was added:
> + ----- Method: Symbol>>canBeToken (in category 'testing') -----
> + canBeToken
> + 	"Since definition of #tokenish depends on a preference, we want to make sure
> + 	that underscores are always considered tokenish. This is so that selectors created
> + 	when the preference was turned on don't suddenly become invalid when the
> + 	preference is turned off."
> +
> + 	^ self allSatisfy: [:c | c = $_ or: [c tokenish]]!
>
> Item was removed:
> - ----- Method: Symbol>>numArgs (in category 'accessing') -----
> - numArgs
> - 	"Answer either the number of arguments that the receiver would take if considered a selector.  Answer -1 if it couldn't be a selector.  Note that currently this will answer -1 for anything begining with an uppercase letter even though the system will accept such symbols as selectors.  It is intended mostly for the assistance of spelling correction."
> -
> - 	| firstChar numColons excess start ix |
> - 	self size = 0 ifTrue: [^ -1].
> - 	firstChar := self at: 1.
> - 	(firstChar isLetter or: [firstChar = $:]) ifTrue:
> - 		[2 to: self size do:
> - 			[:i || c |
> - 			c := self at: i.
> - 			(c = $_ or: [c tokenish]) ifFalse: [^ -1]].
> - 		"Fast colon count"
> - 		numColons := 0.  start := 1.
> - 		[(ix := self indexOf: $: startingAt: start) > 0]
> - 			whileTrue:
> - 				[numColons := numColons + 1.
> - 				start := ix + 1].
> - 		numColons = 0 ifTrue: [^ 0].
> - 		firstChar = $:
> - 			ifTrue: [excess := 2 "Has an initial keyword, as #:if:then:else:"]
> - 			ifFalse: [excess := 0].
> - 		self last = $:
> - 			ifTrue: [^ numColons - excess]
> - 			ifFalse: [^ numColons - excess - 1 "Has a final keywords as #nextPut::andCR"]].
> - 	firstChar isSpecial ifTrue:
> - 		[self size = 1 ifTrue: [^ 1].
> - 		2 to: self size do: [:i | (self at: i) isSpecial ifFalse: [^ -1]].
> - 		^ 1].
> - 	^ -1.!
>
>
>


More information about the Squeak-dev mailing list