[squeak-dev] The Trunk: Collections-ct.982.mcz

Levente Uzonyi leves at caesar.elte.hu
Sun Jan 30 13:56:34 UTC 2022


Hi Christoph,

I just had the idea to use a proxy that converts cascades to chained 
message sends to support your use case.
The following snippet

((((((1 to: 100) asArray reversed
 	collect: [ :each | each squared + 1 ])
 	select: #even)
 	collect: [ :each | each // 2 ])
 	select: [ :each | each \\ 7 = 1 ])
 	first: 5)
 	sorted

can be written as

(1 to: 100) wrap: [ :wrapper |
 	wrapper
 		asArray;
 		reversed;
 		collect: [ :each | each squared + 1 ];
 		select: #even;
 		collect: [ :each | each // 2 ];
 		select: [ :each | each \\ 7 = 1 ];
 		first: 5;
 		sorted ]

I attached the change set in case you're interested.


Levente
-------------- next part --------------
'From Squeak5.3 of 15 April 2020 [latest update: #19435] on 30 January 2022 at 2:27:17 pm'!
Smalltalk renameClassNamed: #ChainedObjectWrapper as: #ChainedObjectWrapper!
ProtoObject subclass: #ChainedObjectWrapper
	instanceVariableNames: 'object'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'ChainedObjectWrapper'!

!ChainedObjectWrapper commentStamp: 'ul 1/30/2022 14:24' prior: 0!
I am a proxy-like object that lets you use cascades but the message sends are chained, so that you don't have to use parentheses.
Do not use me directly, send #wrap: to the receiver instead.
For example, the two snippets below are equivalent.

(1 to: 100) wrap: [ :wrapper |
	wrapper
		asArray;
		reversed;
		collect: [ :each | each squared + 1 ];
		select: #even;
		collect: [ :each | each // 2 ];
		select: [ :each | each \\ 7 = 1 ];
		first: 5;
		sorted ]

((((((1 to: 100) asArray reversed
	collect: [ :each | each squared + 1 ])
	select: #even)
	collect: [ :each | each // 2 ])
	select: [ :each | each \\ 7 = 1 ])
	first: 5)
	sorted

Instance Variables
	object:		<Object>

object
	- the object the next message should be proxied to!
]style[(244 1 1 1 3 1 3 2 5 4 7 1 1 2 7 3 7 4 8 4 8 1 1 2 4 1 1 1 4 1 7 1 1 1 1 1 1 4 7 1 5 4 8 1 1 2 4 1 1 1 4 1 2 1 1 1 1 4 7 1 1 2 4 1 1 1 4 1 2 1 1 1 1 1 1 1 1 4 6 1 1 4 6 3 1 1 1 1 1 1 1 1 1 3 1 3 1 1 7 1 8 2 8 1 1 2 4 1 1 1 4 1 7 1 1 1 1 1 1 1 2 7 1 5 1 2 8 1 1 2 4 1 1 1 4 1 2 1 1 1 1 1 2 7 1 1 2 4 1 1 1 4 1 2 1 1 1 1 1 1 1 1 1 2 6 1 1 3 6 99),cblack;,c126000000,cblack;,c000000126,cblack;,c126000000,cblack;,c000000126,cblack;,c000000126,cblack;,cgray;,cblack;,c000000126,cblack;,c000000126,cblack;,c000000126,cblack;,c000000126,cblack;,c000126000,cblack;,c000000126,cblack;,cgray;,cblack;,c000000126,cblack;,c000000126,cblack;,c000000126,cblack;,c126000000,cblack;,c000126000,cblack;,c000000126,cblack;,c000000126,cblack;,c000000126,cblack;,c000126000,cblack;,c000000126,cblack;,cgray;,cblack;,c000000126,cblack;,c000000126,cblack;,c126000000,cblack;,c000126000,cblack;,c000000126,cblack;,c000126000,cblack;,c000000126,cblack;,cgray;,cblack;,c000000126,cblack;,c000000126,cblack;,c126000000,cblack;,c000000126,cblack;,c126000000,cblack;,c000126000,cblack;,c000000126,cblack;,c126000000,cblack;,c000000126,cblack;,,cblack;,c000126000,c126000126,c126000000,c000234000,c234140000,c126000000,cblack;,c000000126,cblack;,c126000000,c234140000,cblack;,c000000126,cblack;,c000000126,cblack;,c000000126,cblack;,c234140000,cblack;,c000000126,cblack;,cgray;,cblack;,c000000126,cblack;,c000000126,cblack;,c000000126,cblack;,c126000000,cblack;,c234140000,c000234000,cblack;,c000000126,cblack;,c000000126,c126000000,cblack;,c000000126,cblack;,c126000000,cblack;,c000000126,cblack;,cgray;,cblack;,c000000126,cblack;,c000000126,cblack;,c126000000,cblack;,c126000000,c126000126,cblack;,c000000126,cblack;,c126000126,cblack;,c000000126,cblack;,cgray;,cblack;,c000000126,cblack;,c000000126,cblack;,c126000000,cblack;,c000000126,cblack;,c126000000,cblack;,c126000126,c000126000,cblack;,c000000126,cblack;,c126000000,cblack;,c000000126,!


!ChainedObjectWrapper methodsFor: 'system primitives' stamp: 'ul 1/30/2022 13:23'!
doesNotUnderstand: aMessage

	object := aMessage sendTo: object! !


!Object methodsFor: '*ChainedObjectWrapper' stamp: 'ul 1/30/2022 13:27'!
wrap: aBlock

	| wrapper |
	wrapper := ChainedObjectWrapper on: self.
	aBlock value: wrapper.
	^thisContext object: wrapper instVarAt: 1! !


!ChainedObjectWrapper class methodsFor: 'instance creation' stamp: 'ul 1/30/2022 13:26'!
on: anObject

	| wrapper |
	wrapper := self new.
	thisContext object: wrapper instVarAt: 1 put: anObject.
	^wrapper! !


!ChainedObjectWrapper reorganize!
('system primitives' doesNotUnderstand:)
!



More information about the Squeak-dev mailing list