A new version of Collections was added to project The Inbox:
http://source.squeak.org/inbox/Collections-cwp.491.mcz ==================== Summary ==================== Name: Collections-cwp.491 Author: cwp Time: 21 October 2012, 11:37:20.466 pm UUID: ecb9c37e-309e-43eb-8f24-3d5662da038e Ancestors: Collections-fbs.490 Cleaned up the behavior of #numArgs with respect to selectors containing underscores. =============== Diff against Collections-fbs.490 =============== Item was changed: ----- Method: String class>>initialize (in category 'initialization') ----- initialize "self initialize" | order | AsciiOrder := (0 to: 255) as: ByteArray. CaseInsensitiveOrder := AsciiOrder copy. ($a to: $z) do: [:c | CaseInsensitiveOrder at: c asciiValue + 1 put: (CaseInsensitiveOrder at: c asUppercase asciiValue +1)]. "Case-sensitive compare sorts space, digits, letters, all the rest..." CaseSensitiveOrder := ByteArray new: 256 withAll: 255. order := -1. ' 0123456789' do: "0..10" [:c | CaseSensitiveOrder at: c asciiValue + 1 put: (order := order+1)]. ($a to: $z) do: "11-64" [:c | CaseSensitiveOrder at: c asUppercase asciiValue + 1 put: (order := order+1). CaseSensitiveOrder at: c asciiValue + 1 put: (order := order+1)]. 1 to: CaseSensitiveOrder size do: [:i | (CaseSensitiveOrder at: i) = 255 ifTrue: [CaseSensitiveOrder at: i put: (order := order+1)]]. order = 255 ifFalse: [self error: 'order problem']. "a table for translating to lower case" LowercasingTable := String withAll: (Character allByteCharacters collect: [:c | c asLowercase]). "a table for translating to upper case" UppercasingTable := String withAll: (Character allByteCharacters collect: [:c | c asUppercase]). "a table for testing tokenish (for fast numArgs)" + self initializeTokenish. - Tokenish := String withAll: (Character allByteCharacters collect: - [:c | c tokenish ifTrue: [c] ifFalse: [$~]]). "CR and LF--characters that terminate a line" CSLineEnders := CharacterSet crlf. "separators and non-separators" CSSeparators := CharacterSet separators. CSNonSeparators := CSSeparators complement. "% and < for #expandMacros*" CSMacroCharacters := CharacterSet newFrom: '%<'. "a table for exchanging cr with lf and vica versa" CrLfExchangeTable := Character allByteCharacters collect: [ :each | each caseOf: { [ Character cr ] -> [ Character lf ]. [ Character lf ] -> [ Character cr ] } otherwise: [ each ] ]! Item was added: + ----- Method: String class>>initializeTokenish (in category 'initialization') ----- + initializeTokenish + Tokenish := String withAll: + (Character allByteCharacters collect: + [ :c | + c tokenish + ifTrue: [ c ] + ifFalse: [ $~ ]]) ! 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 excess start ix | self size = 0 ifTrue: [^ -1]. firstChar := self at: 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]]]. - Scanner prefAllowUnderscoreSelectors ifFalse: - [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 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>>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.! |
Free forum by Nabble | Edit this page |