Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Defining methods with double greater than sign (>>) in Smalltalk

In the book Smalltalk Best Practice Patterns from Kent Beck, the double greater sign (>>) is used to define methods like this:

Point class>>x: xNumber y: yNumber
    ^self new
        setX: xNumber
        y: yNumber

Point>>setX: xNumber y: yNumber
    x := xNumber.
    y := yNumber.
    ^self

However, I cannot get it run in GNU Smalltalk.

Is it valid syntax in some implementation of Smalltalk? Or is it just kind of pseudo code?

like image 334
Domon Avatar asked Mar 10 '13 11:03

Domon


2 Answers

In fact this is Pseudo code.

In other languages you would use the . to tell people that the method is in this class but in smalltalk you write >>

What you would do in a Smalltalk like Squeak or Pharo for

Point class>>x: xNumber y: yNumber
    ^self new
        setX: xNumber
        y: yNumber
  1. Open the System Browser
  2. klick on class, a button that will show you the class side of the class.
  3. paste the method in the text area with the source code:

    x: xNumber y: yNumber
        ^self new
            setX: xNumber
            y: yNumber
    
  4. Strg-s to save the code

For

Point>>setX: xNumber y: yNumber
    x := xNumber.
    y := yNumber.
    ^self

You would do the same but not use the class side

like image 150
User Avatar answered Nov 19 '22 17:11

User


Also, notice that indeed, #>> is a message that you can send to a class and it basically access the method dictionary for the symbol (selector argument). See, Behavior class, method >>

  >> selector 
"Answer the compiled method associated with the argument, selector (a 
Symbol), a message selector in the receiver's method dictionary. If the 
selector is not in the dictionary, create an error notification."

^self compiledMethodAt: selector

So you can do, for example (inspect that)

  Point class >> #x:y:

Notice however, that here we send #class because #x:y: is a class side method. If you want to access an instance side method, say #normalized then you can do:

  Point >> #normalized
like image 4
user1942893 Avatar answered Nov 19 '22 15:11

user1942893