Search code examples
smalltalk

Explain a piece of Smalltalk code?


I cannot understand this piece of Smalltalk code:

[(line := self upTo: Character cr) size = 0] whileTrue.

Can anybody help explain it?


Solution

  • One easy thing to do, if you have the image where the code came from, is run a debugger on it and step through.

    If you came across the code out of context, like a mailing list post, then you could browse implementers of one of the messages and see what it does. For example, #size and #whileTrue are pretty standard, so we'll skip those for now, but #upTo: sounds interesting. It reminds me of the stream methods, and bringing up implementors on it confirms that (in Pharo 1.1.1), ReadStream defines it. There is no method comment, but OmniBrowser shows a little arrow next to the method name indicating that it is defined in a superclass. If we check the immediate superclass, PositionableStream, there is a good method comment explaining what the method does, which is draw from the stream until reaching the object specified by the argument.

    Now, if we parse the code logically, it seems that it:

    • reads a line from the stream (i.e. up to a cr)
      • if it is empty (size = 0), the loop continues
      • if it is not, it is returned

    So, the code skips all empty lines and returns the first non-empty one. To confirm, we could pass it a stream on a multi-line string and run it like so:

    line := nil.
    paragraph := '
    
    
    this is a line of text.
    this is another line
    line number three' readStream.
    [(line := paragraph upTo: Character cr) size = 0] whileTrue.
    line. "Returns 'this is a line of text.'"