[Cuis-dev] [RFC] Class and Metaclass changes to support environments

Gerald Klix cuis.01 at klix.ch
Tue Oct 6 05:20:00 PDT 2020


Hi all, hi Juan, hi Hernan,

here come some changes to Class and Metaclass
to support name lookup in environments.

I hope this change is OK, currently it did not
get much testing.


Best Regards,

Gerald
-------------- next part --------------
'From Cuis 5.0 [latest update: #4384] on 6 October 2020 at 2:10:42 pm'!

!Class methodsFor: 'compiling' stamp: 'KLG 10/6/2020 14:06:06'!
nonLocalBindingOf: aVarName
	"Answer the non local binding of aVarName.
	
	Answer nil if no binding is available."

	"The metaclass provides the environment to search in."
	self class forNonLocalBindingEnvironmentsDo: [ :environment |
		environment bindingOf: aVarName :: ifNotNil: [ :binding | ^ binding ] ].
	^ nil ! !


!Metaclass methodsFor: 'compiling' stamp: 'KLG 10/6/2020 14:08:05'!
forNonLocalBindingEnvironmentsDo: aBlock
	"Evaluate aBlock for all non local environments.
	
	Maybe overriden in meta classes, that provide support/for
	environments/namespaces.
	
	Ordinary metaclasses only provide Smalltalk as global namespace."

	^ aBlock value: Smalltalk! !


!Class methodsFor: 'compiling' stamp: 'KLG 10/6/2020 14:03:40'!
binding

	^ self nonLocalBindingOf: name :: ifNil: [ nil -> self ]! !

!Class methodsFor: 'compiling' stamp: 'KLG 10/6/2020 14:04:26'!
bindingOf: varName
	"Answer the binding of some variable resolved in the scope of the receiver"
	| aSymbol |
	aSymbol _ varName asSymbol.

	"First look in receiver, and up the hierarchy. Inherited variables take precedence over globals."
	(self localBindingOf: aSymbol) ifNotNil: [ :binding | ^binding ].

	"Next look in globals."
	(self nonLocalBindingOf: aSymbol) ifNotNil: [ :binding | ^binding ].

	"Fail at the end."
	^nil! !



More information about the Cuis-dev mailing list