This comparison was part of MiscPrimitivePlugin.
MiscPrimitivePlugin is a false good idea:
Smalltalk fallback code = VMMaker (slang) source

Unfortunately, this is an illusion because unlike the C source inclusions
in ST/X we don't have dynamic slang compilation!
The consequence is that source code is not managed in VMMaker specific
package, but in a dialect specific/version specific package!
Squeak/Pharo/Cuis/Newspeak may all have a different version of String at
image side.
This is making VMMaker recipe for code generation more fragile than
necessary (and not easily portable to Pharo/Cuis/whatever...).

It seems to me that Clement did start a rewrite of essential primitives
into proper plugin...
The plan was then to retract support of MiscPrimitivePlugin after a grace
period (after all, these are optional primitives).


Le lun. 16 sept. 2019 à 13:39, Esteban Maringolo <[email protected]> a
écrit :

> I haven't followed nor maintained the SortFunctions library, but it
> relied heavily on the response of that method, by means of the
> "spaceship operator" ( #<=>), I think that Sven later changed such
> operator to "threeWayCompareTo:".
>
> I don't know whether the primitive is available now, it wasn't back then.
>
> Regards,
>
> Esteban A. Maringolo
>
> On Mon, Sep 16, 2019 at 3:52 AM ducasse <[email protected]> wrote:
> >
> > I see
> >
> > threeWayCompareTo: aString
> >         "Do a three-way comparison between the receiver and
> anotherObject, returning
> >         -1 if self < anotherObject
> >         0 if self = anotherObject
> >         1 if self > anotherObject
> >         This assumes a total order in accordance with the mathematical
> law of trichotomy.
> >         See also:  http://en.wikipedia.org/wiki/Three-way_comparison";
> >
> >          ^ (self compare: self with: aString collated: AsciiOrder) - 2
> >
> > And I thought that we got a new primitive returning -101 directly
> > Is it not the case?
> >
> > Stef
> >
> >
> > String>>compare: string1 with: string2 collated: order
> >
> >         "'abc' = 'abc' asWideString >>> true"
> >         "'abc' asWideString = 'abc' >>> true"
> >         "(ByteArray with: 97 with: 0 with: 0 with: 0) asString ~= 'a000'
> asWideString >>> true"
> >         "('abc' sameAs: 'aBc' asWideString) >>> true"
> >         "('aBc' asWideString sameAs: 'abc') >>> true"
> >         "('a000' asWideString ~= (ByteArray with: 97 with: 0 with: 0
> with: 0) asString) >>> true"
> >         "((ByteArray with: 97 with: 0 with: 0 with: 0) asString sameAs:
> 'Abcd' asWideString) >>> false"
> >         "('a000' asWideString sameAs: (ByteArray with: 97 with: 0 with:
> 0 with: 0) asString) >>> false"
> >
> >         (string1 isByteString and: [string2 isByteString]) ifTrue: [
> >                 ^ ByteString compare: string1 with: string2 collated:
> order].
> >      "Primitive does not fail properly right now"
> >         ^ String compare: string1 with: string2 collated: order
> >
> >
> > ByteString>>compare: string1 with: string2 collated: order
> >         "Return 1, 2 or 3, if string1 is <, =, or > string2, with the
> collating order of characters given by the order array."
> >
> >         | len1 len2 c1 c2 |
> >         <primitive: 'primitiveCompareString' module:
> 'MiscPrimitivePlugin'>
> >
> >         <var: #string1 declareC: 'unsigned char *string1'>
> >         <var: #string2 declareC: 'unsigned char *string2'>
> >         <var: #order declareC: 'unsigned char *order'>
> >
> >         len1 := string1 size.
> >         len2 := string2 size.
> >         1 to: (len1 min: len2) do:
> >                 [:i |
> >                 c1 := order at: (string1 basicAt: i) + 1.
> >                 c2 := order at: (string2 basicAt: i) + 1.
> >                 c1 = c2 ifFalse:
> >                         [c1 < c2 ifTrue: [^ 1] ifFalse: [^ 3]]].
> >         len1 = len2 ifTrue: [^ 2].
> >         len1 < len2 ifTrue: [^ 1] ifFalse: [^ 3].
> >
> >
> >
> >
>
>

Reply via email to