[Cuis] Determining dialect programmatically

David T. Lewis lewis at mail.msen.com
Sun Jan 27 10:46:34 CST 2013


On Sun, Jan 27, 2013 at 12:22:45PM -0300, Juan Vuletich wrote:
> Hi Casey,
> 
> Casey Ransberger wrote:
> >I'm thinking I might want to do some stuff conditionally based on 
> >platform, is the best way to find out whether I'm on Pharo/Squeak/Cuis?
> >
> >(SystemVersion current version beginsWith: 'Cuis') ifTrue: [ #foo ]
> >(SystemVersion current version beginsWith: 'Squeak') ifTrue: [ #bar ]
> >(SystemVersion current version beginsWith: 'Pharo') ifTrue: [ #baz ]
> >
> >-- 
> >Casey Ransberger
> 
> This sounds right to me. But if you want to add #isCuis, #isSqueak, 
> #isPharo, etc to SystemDictionary or some base class, that would be ok 
> too. You'd need to convince the Squeak and Pharo folks to add them too. 
> It looks like they would agree.

Just a note of caution - keeping up with these differences can be a real
pain. Pharo is particularly challenging, because there are multiple incompatible
versions of Pharo, and some versions raise deprecation warnings about the
previously correct usage in another version. This means that testing for
#isPharo is usually not sufficient, because Pharo 1.4 is very different from
Pharo 2.0. The same would be true for Squeak but to a much lesser degree.

Here are a couple of compatibility methods from OSProcess to illustrate:

   OSProcess class>>directoryEntryNames: path
      "Use FileReference if available, otherwise use traditional FileDirectory"
   
      ^ (path respondsTo: #asFileReference)
         ifTrue: [ (path perform: #asFileReference) children collect: [:e | e perform: #basename] ]
         ifFalse: [ ((Smalltalk at: #FileDirectory) on: path) entries collect: [:e | e name] ]
   
   
   OSProcess class>>osVersion
      "After Squeak version 3.6, #osVersion was moved to SmalltalkImage. Some
      versions of Pharo move this to OSPlatform and issue deprecation warnings
      about the other usages."
   
      ^ (((Smalltalk hasClassNamed: #OSPlatform)
            and: [(Smalltalk at: #OSPlatform)
                  respondsTo: #osVersion])
         ifTrue: [Smalltalk at: #OSPlatform]
         ifFalse: [((Smalltalk classNamed: 'SmalltalkImage')
               ifNil: [^ Smalltalk osVersion]) current]) osVersion

I'm sure there are better ways to do this, but keeping up with multiple image
versions can be a lot of work and the code can get quite ugly.

(I have not yet tried updating OSProcess for Cuis, but I do want to do so).

Dave





More information about the Cuis mailing list