[Pharo-project] namespace collisions
Does Pharo have namespaces? If not, may I request that we remember to apply due consideration when choosing names for globals, including class-variables? The top version of ScriptLoader in the Pharo repository consumes the name #Repository, preventing any class or global from using that name. I am now faced with a namespace collision with another package that wants to declare a class named Repository. A class-var in "ScriptLoader" really doesn't need to consume such a valuable name does it? Can this be renamed to something more specific to free up that name? - Chris
Yes we can. Stef On Sep 9, 2009, at 11:56 PM, Chris Muller wrote:
Does Pharo have namespaces?
If not, may I request that we remember to apply due consideration when choosing names for globals, including class-variables?
The top version of ScriptLoader in the Pharo repository consumes the name #Repository, preventing any class or global from using that name. I am now faced with a namespace collision with another package that wants to declare a class named Repository.
A class-var in "ScriptLoader" really doesn't need to consume such a valuable name does it? Can this be renamed to something more specific to free up that name?
- Chris
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
Chris may be I'm not well woken up but do you imply that classVar binding are stored in the systemDictionary? I imagine that we can still have two classes having the same classVar name Default without problem so I'm confused. Stef On Sep 9, 2009, at 11:56 PM, Chris Muller wrote:
Does Pharo have namespaces?
If not, may I request that we remember to apply due consideration when choosing names for globals, including class-variables?
The top version of ScriptLoader in the Pharo repository consumes the name #Repository, preventing any class or global from using that name. I am now faced with a namespace collision with another package that wants to declare a class named Repository.
A class-var in "ScriptLoader" really doesn't need to consume such a valuable name does it? Can this be renamed to something more specific to free up that name?
- Chris
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
Ah, ok, I am confused too. I can probably work around this, but.. The problem occurred when I tried to upgrade my version of ScriptLoader. I already had a class named #Repository in my image, but when I tried to load the latest in the Pharo repository via MC, I get the following stack trace. I hadn't considered whether ClassVar names would or wouldn't clash with Class names (not to mention which the compiler would interpret in an ambiguous situation..), and and Squeak let me define a class and class-var of the same name. However, MC will not let me load something because it found an existing #bindingOf: #Repository.. I can work around this, no need to rename that class-var.. Thanks.. ScriptLoader class(Object)>>error: Receiver: ScriptLoader Arguments and temporary variables: aString: 'Repository is defined elsewhere' Receiver's instance variables: superclass: Object methodDict: a MethodDictionary(size 961) format: 134 instanceVariables: #('repository' 'inboxRepository') organization: ('accessing' gofer inboxRepository installer repository repositor...etc... subclasses: nil name: #ScriptLoader classPool: nil sharedPools: nil environment: a SystemDictionary(lots of globals) category: #ScriptLoader traitComposition: nil localSelectors: nil [] in ScriptLoader class(Class)>>declare: {[:var | (self bindingOf: var) notNil ifTrue: [self error: var , ' is defin...]} Arguments and temporary variables: varString: 'CurrentScriptVersionNumber PackagesBeforeLastLoad Repository Curren...etc... newVars: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #Cur...etc... conflicts: false x: 'LogStream' var: #Repository Array(SequenceableCollection)>>do: Receiver: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #CurrentUpdateVersionNum...etc... Arguments and temporary variables: aBlock: [] in ScriptLoader class(Class)>>declare: {[:var | (self bindingOf: var...etc... index: 3 indexLimiT: 5 Receiver's instance variables: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #CurrentUpdateVersionNum...etc... ScriptLoader class(Class)>>declare: Receiver: ScriptLoader Arguments and temporary variables: varString: 'CurrentScriptVersionNumber PackagesBeforeLastLoad Repository Curren...etc... newVars: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #Cur...etc... conflicts: false x: 'LogStream' var: #Repository Receiver's instance variables: superclass: Object methodDict: a MethodDictionary(size 961) format: 134 instanceVariables: #('repository' 'inboxRepository') organization: ('accessing' gofer inboxRepository installer repository repositor...etc... subclasses: nil name: #ScriptLoader classPool: nil sharedPools: nil environment: a SystemDictionary(lots of globals) category: #ScriptLoader traitComposition: nil localSelectors: nil --- The full stack --- ScriptLoader class(Object)>>error: [] in ScriptLoader class(Class)>>declare: {[:var | (self bindingOf: var) notNil ifTrue: [self error: var , ' is defin...]} Array(SequenceableCollection)>>do: ScriptLoader class(Class)>>declare: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [] in ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe: {[unsafe ifFalse: [(self validateSuperclass: newSuper forSubclass: oldClass...]} BlockContext>>ensure: ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe: ClassBuilder>>name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category: MCClassDefinition>>createClass MCClassDefinition>>load MCClassDefinition(MCDefinition)>>loadOver: [] in MCPackageLoader>>basicLoad {[:ea | ea loadOver: (self obsoletionFor: ea)]} [] in OrderedCollection(SequenceableCollection)>>do:displayingProgress: {[:each :i | bar value: i. aBlock value: each]} OrderedCollection(SequenceableCollection)>>withIndexDo: [] in OrderedCollection(SequenceableCollection)>>do:displayingProgress: {[:bar | self withIndexDo: [:each :i | bar value: i. aBlock value: e...]} [] in ProgressInitiationException>>defaultMorphicAction {[result := workBlock value: progress]} BlockContext>>ensure: ProgressInitiationException>>defaultMorphicAction ProgressInitiationException>>defaultAction UndefinedObject>>handleSignal: MethodContext(ContextPart)>>handleSignal: MethodContext(ContextPart)>>handleSignal: MethodContext(ContextPart)>>handleSignal: ProgressInitiationException(Exception)>>signal ProgressInitiationException>>display:at:from:to:during: ...etc... On Thu, Sep 10, 2009 at 2:35 AM, Stéphane Ducasse <stephane.ducasse@inria.fr> wrote:
Chris
may be I'm not well woken up but do you imply that classVar binding are stored in the systemDictionary? I imagine that we can still have two classes having the same classVar name Default without problem so I'm confused.
Stef
On Sep 9, 2009, at 11:56 PM, Chris Muller wrote:
Does Pharo have namespaces?
If not, may I request that we remember to apply due consideration when choosing names for globals, including class-variables?
The top version of ScriptLoader in the Pharo repository consumes the name #Repository, preventing any class or global from using that name. I am now faced with a namespace collision with another package that wants to declare a class named Repository.
A class-var in "ScriptLoader" really doesn't need to consume such a valuable name does it? Â Can this be renamed to something more specific to free up that name?
- Chris
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
Ah, ok, I am confused too. I can probably work around this, but.. The problem occurred when I tried to upgrade my version of ScriptLoader. I already had a class named #Repository in my image, but when I tried to load the latest in the Pharo repository via MC, I get the following stack trace.
I hadn't considered whether ClassVar names would or wouldn't clash with Class names (not to mention which the compiler would interpret in an ambiguous situation..), and and Squeak let me define a class and class-var of the same name.
in pharo too. this is strange I'm exhausted right now so better go to sleep but this is strange.
However, MC will not let me load something because it found an existing #bindingOf: #Repository..
I can work around this, no need to rename that class-var..
Thanks..
ScriptLoader class(Object)>>error: Receiver: ScriptLoader Arguments and temporary variables: aString: 'Repository is defined elsewhere' Receiver's instance variables: superclass: Object methodDict: a MethodDictionary(size 961) format: 134 instanceVariables: #('repository' 'inboxRepository') organization: ('accessing' gofer inboxRepository installer repository repositor...etc... subclasses: nil name: #ScriptLoader classPool: nil sharedPools: nil environment: a SystemDictionary(lots of globals) category: #ScriptLoader traitComposition: nil localSelectors: nil
[] in ScriptLoader class(Class)>>declare: {[:var | (self bindingOf: var) notNil ifTrue: [self error: var , ' is defin...]} Arguments and temporary variables: varString: 'CurrentScriptVersionNumber PackagesBeforeLastLoad Repository Curren...etc... newVars: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #Cur...etc... conflicts: false x: 'LogStream' var: #Repository
Array(SequenceableCollection)>>do: Receiver: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #CurrentUpdateVersionNum...etc... Arguments and temporary variables: aBlock: [] in ScriptLoader class(Class)>>declare: {[:var | (self bindingOf: var...etc... index: 3 indexLimiT: 5 Receiver's instance variables: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #CurrentUpdateVersionNum...etc...
ScriptLoader class(Class)>>declare: Receiver: ScriptLoader Arguments and temporary variables: varString: 'CurrentScriptVersionNumber PackagesBeforeLastLoad Repository Curren...etc... newVars: #(#CurrentScriptVersionNumber #PackagesBeforeLastLoad #Repository #Cur...etc... conflicts: false x: 'LogStream' var: #Repository Receiver's instance variables: superclass: Object methodDict: a MethodDictionary(size 961) format: 134 instanceVariables: #('repository' 'inboxRepository') organization: ('accessing' gofer inboxRepository installer repository repositor...etc... subclasses: nil name: #ScriptLoader classPool: nil sharedPools: nil environment: a SystemDictionary(lots of globals) category: #ScriptLoader traitComposition: nil localSelectors: nil
--- The full stack --- ScriptLoader class(Object)>>error: [] in ScriptLoader class(Class)>>declare: {[:var | (self bindingOf: var) notNil ifTrue: [self error: var , ' is defin...]} Array(SequenceableCollection)>>do: ScriptLoader class(Class)>>declare: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [] in ClassBuilder
name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe : {[unsafe ifFalse: [(self validateSuperclass: newSuper forSubclass: oldClass...]} BlockContext>>ensure: ClassBuilder
name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category:unsafe : ClassBuilder
name:inEnvironment:subclassOf:type:instanceVariableNames:classVariableNames:poolDictionaries:category : MCClassDefinition>>createClass MCClassDefinition>>load MCClassDefinition(MCDefinition)>>loadOver: [] in MCPackageLoader>>basicLoad {[:ea | ea loadOver: (self obsoletionFor: ea)]} [] in OrderedCollection(SequenceableCollection)>>do:displayingProgress: {[:each :i | bar value: i. aBlock value: each]} OrderedCollection(SequenceableCollection)>>withIndexDo: [] in OrderedCollection(SequenceableCollection)>>do:displayingProgress: {[:bar | self withIndexDo: [:each :i | bar value: i. aBlock value: e...]} [] in ProgressInitiationException>>defaultMorphicAction {[result := workBlock value: progress]} BlockContext>>ensure: ProgressInitiationException>>defaultMorphicAction ProgressInitiationException>>defaultAction UndefinedObject>>handleSignal: MethodContext(ContextPart)>>handleSignal: MethodContext(ContextPart)>>handleSignal: MethodContext(ContextPart)>>handleSignal: ProgressInitiationException(Exception)>>signal ProgressInitiationException>>display:at:from:to:during: ...etc...
On Thu, Sep 10, 2009 at 2:35 AM, Stéphane Ducasse <stephane.ducasse@inria.fr> wrote:
Chris
may be I'm not well woken up but do you imply that classVar binding are stored in the systemDictionary? I imagine that we can still have two classes having the same classVar name Default without problem so I'm confused.
Stef
On Sep 9, 2009, at 11:56 PM, Chris Muller wrote:
Does Pharo have namespaces?
If not, may I request that we remember to apply due consideration when choosing names for globals, including class-variables?
The top version of ScriptLoader in the Pharo repository consumes the name #Repository, preventing any class or global from using that name. I am now faced with a namespace collision with another package that wants to declare a class named Repository.
A class-var in "ScriptLoader" really doesn't need to consume such a valuable name does it? Can this be renamed to something more specific to free up that name?
- Chris
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
participants (2)
-
Chris Muller -
Stéphane Ducasse