[Newbies] Re: Adding methods to Integers...

Bert Freudenberg bert at freudenbergs.de
Thu Apr 12 16:31:55 UTC 2007


This is actually wrong. Only SmallIntegers are special [*].

What happens is this: When you add two SmallIntegers (like "3 + 4"),  
and the result is a SmallInteger, the result is calculated in the  
bytecode directly. Otherwise, a regular send of #+ is performed. From  
there, everything else happens in the image, including conversion to  
LargeIntegers - see implementors of #+. Like, if the receiver was a  
SmallInteger, it tries the "add" primitive, which fails, and then the  
implementation of #+ in class Integer is invoked. This method then  
creates a large integer.

For the implementation of all this see #bytecodePrimAdd and  
#primitiveAdd. You may have to load VMMaker first.

- Bert -

[*] Well, Floats are optimized a bit, and we have a plugin to speed  
up LargeIntegers, but this is all optional and  doesn't matter in  
this discussion.

On Apr 12, 2007, at 18:05 , Klaus D. Witzel wrote:

> Hi Patrick,
>
> some of the symptoms you describe have to do with a small set of  
> classes being "hardwired" in Squeak's virtual machine. To see which  
> they are, evaluate (printIt)
>
>  Smalltalk specialObjectsArray select: [:each | each isBehavior]
>
> So when you do primitive arithmethic with your own subclass of  
> LargePositiveInteger, the VM returns an instance of  
> LargePositiveInteger (and not your subinstance of it).
>
> Of course the specialObjectsArray can be changed and from then on  
> the VM (after being notified) will use your subclass but, I think  
> this is not what you really want ;-)
>
> Putting your methods into Integer is fine as long as they do not  
> conflict with anything else. Yes, this is the usual approach for  
> adding new behavior to all the integers :)
>
> /Klaus
>
> On Thu, 12 Apr 2007 17:28:01 +0200, you wrote:
>
>>
>> Background:
>> ::::::::::::::::::::::
>>
>> 	The most recent MathFactor Podcast ( http://mathfactor.uark.edu/ )
>> 	ended with a request to write a computer program that could, in
>> 	principal, given enough time and memory, compute Graham's Number
>> 	( http://mathworld.wolfram.com/GrahamsNumber.html ).
>>
>> 	Smalltalk was a natural choice since it already supports  
>> LargeIntegers.
>>
>> Problem:
>> :::::::::::::::
>>
>> 	Being new to Smalltalk, my first thought was that I should make my
>> 	own class as a subclass of LargePositiveInteger, put my methods  
>> there,
>> 	and violá.  Alas, no love.
>>
>> 	I ran into the following problems:
>> 		* I couldn't find a way to give a value to myself.
>> 		* I couldn't find a way to get integers to adapt to my class  
>> anyway.
>>
>> 	I ended up just adding my methods to the Integer class.  But,  
>> this felt
>> 	very naughty.  Is it the usual approach?
>>
>> Thanks,
>> Patrick
>
> _______________________________________________
> Beginners mailing list
> Beginners at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/mailman/listinfo/beginners






More information about the Beginners mailing list