Clement
thanks for the information. I thought about that.
From a language perspective what you describe is plain bad.
Implementation should not creep in the language semantics. As a normal
developer I do not want to know how I can redefine special optimized
selectors.
either the compiler should raise a warning when I redefine them or
forbid it.
As a normal developer I should not have to deal and understand such issues.
Stef
Le 30/4/15 22:31, Clément Bera a écrit :
You cannot easily redefine these selectors:
#(#caseOf: #to:do: #ifNotNil: #ifNil:ifNotNil: #whileTrue:
#ifNotNil:ifNil: #ifFalse: #timesRepeat: #whileTrue #caseOf:otherwise:
#whileFalse: #ifNil: #to:by:do: #ifTrue: #ifFalse:ifTrue: #or:
#whileFalse #ifTrue:ifFalse: #and:)
You can redefine those selectors but depending on the send site, the
redefined method is used or not.
One trick is to have the send site in a method / class with
compilation options disabling the inlining of the selectors you want.
Another trick is to use a pattern different slightly that the
optimized pattern, for example, I believe that Marcus changed #and: so:
a and: [ b ] -> and: is optimized at compile time, send site won't use
overridden method.
a and: [ :x | b ] -> and: is not optimized at compile time, send site
will use overridden method.
Maybe it works with #or: too.
2015-04-30 21:47 GMT+02:00 stepharo <steph...@free.fr
<mailto:steph...@free.fr>>:
In nautilus I get an error MNU: RBBlockNode>>method
When I select several groups and select merge
mergeGroups: aCollection
aCollection
ifNotEmpty: [:groups || group |
group := groups reduce: [:a :b | a or: [b]].
^^^^^^^^^^^^
a is a
dynamicClassGroup and its superclass defines or:
groups do: [:gp |
gp removable
ifTrue: [self groupsManager
removeAGroupSilently: gp]].
^ group].
^ nil
RBBlockNode(Object)>>doesNotUnderstand: #method
RBBlockNode>>sourceNodeForPC:
DynamicClassGroup(Object)>>mustBeBooleanInMagic:
DynamicClassGroup(Object)>>mustBeBoolean
[ :a :b | a or: [ b ] ] in [ :groups |
| group |
group := groups reduce: [ :a :b | a or: [ b ] ].
groups
do: [ :gp |
gp removable
ifTrue: [ self groupsManager removeAGroupSilently: gp ] ].
^ group ] in PackageTreeNautilusUI(AbstractTool)>>mergeGroups: in
Block: [ :a :b | a or: [ b ] ]
[ :index |
arguments
replaceFrom: 2
to: arguments size
with: self
startingAt: index;
at: 1 put: (aBlock valueWithArguments: arguments) ] in
Array(SequenceableCollection)>>reduceLeft: in Block: [ :index | ...
SmallInteger(Number)>>to:by:do:
Array(SequenceableCollection)>>reduceLeft:
Array(SequenceableCollection)>>reduce:
[ :groups |
| group |
group := groups reduce: [ :a :b | a or: [ b ] ].
groups
do: [ :gp |
gp removable
ifTrue: [ self groupsManager removeAGroupSilently: gp ] ].
^ group ] in PackageTreeNautilusUI(AbstractTool)>>mergeGroups: in
Block: [ :groups | ...
BlockClosure>>cull:
Array(Collection)>>ifNotEmpty:
PackageTreeNautilusUI(AbstractTool)>>mergeGroups:
PackageTreeNautilusUI(AbstractNautilusUI)>>mergeGroups
[ target mergeGroups ] in AbstractNautilusUI class>>groupsMenu: in
Block: [ target mergeGroups ]
BlockClosure>>cull:
[
| selArgCount |
"show cursor in case item opens a new MVC window"
(selArgCount := selector numArgs) = 0
ifTrue: [ target perform: selector ]
ifFalse: [
selArgCount = arguments size
ifTrue: [ target perform: selector withArguments:
arguments ]
ifFalse: [ target perform: selector withArguments:
(arguments copyWith: evt) ] ].
self changed ] in
ToggleMenuItemMorph(MenuItemMorph)>>invokeWithEvent: in Block: [ ...
BlockClosure>>ensure:
CursorWithMask(Cursor)>>showWhile:
ToggleMenuItemMorph(MenuItemMorph)>>invokeWithEvent:
ToggleMenuItemMorph(MenuItemMorph)>>mouseUp:
ToggleMenuItemMorph(MenuItemMorph)>>handleMouseUp:
MouseButtonEvent>>sentTo:
ToggleMenuItemMorph(Morph)>>handleEvent:
MorphicEventDispatcher>>dispatchDefault:with:
MorphicEventDispatcher>>handleMouseUp:
MouseButtonEvent>>sentTo:
[ ^ anEvent sentTo: self ] in
MorphicEventDispatcher>>dispatchEvent:with: in Block: [ ^ anEvent
sentTo: self ]
BlockClosure>>ensure:
MorphicEventDispatcher>>dispatchEvent:with: