MagmaCollection

Ross Boylan ross at biostat.ucsf.edu
Sat Sep 12 17:10:15 UTC 2009


Does MagmaCollection preserve order, so that standard collection methods
will always go through objects in the order of original insertion?

While doing some tests for that I ran into "Instances of MagmaCollection
are not indexable" while using at:
at: index 
	"Primitive. Assumes receiver is indexable. Answer the value of an 
	indexable element in the receiver. Fail if the argument index is not an 
	Integer or is out of bounds. Essential. See Object documentation 
	whatIsAPrimitive."

	<primitive: 60>
	index isInteger ifTrue:
		[self class isVariable
			ifTrue: [self errorSubscriptBounds: index]
			ifFalse: [self errorNotIndexable]].
	index isNumber
		ifTrue: [^self at: index asInteger]
		ifFalse: [self errorNonIntegerIndex]

The test was 
|c|
c := MagmaCollection new.
c add: 1; add: 2; add: 3.
c do: [:x | Transcript show: x].
Transcript cr.
c remove: 2.
c do: [:x | Transcript show: x].
Transcript cr.
c add: 4.
c do: [:x | Transcript show: x].
Transcript cr.
Transcript show: (c at: 2); cr.

and the error was in the last line.
BTW, 4 did appear after 3 in the printout, not in the hole created from
removing 2.  So it looks as if insertion order is preserved.
I did NOT have a magma session open when I ran the test.

I was expecting at: to work since http://wiki.squeak.org/squeak/2639
says that MagmaCollection "Provides size and absolute position access
(at: anInteger) making it suitable for scrolling lists".

Finally, is it advisable to use the standard collection methods if the
MagmaCollection is large, or is it better to use a reader?  By "better"
I am mostly thinking of whether the entire collection is forced into
memory or not.  Since the standard collection methods return a "self
species", which is a Bag, I'm guessing it's better to use a reader.

Thanks.
Ross Boylan



More information about the Magma mailing list