These examples work only on GNU Smalltalk 3.0 and later versions. Classic Hello world example:
Some basic Smalltalk code:
Constructing and using an array:
Constructing and using a hash:
Parameter-passing a block to be a closure:
Returning closures from a method:
Using block to send info back to the caller:
Invoke the above method, passing it a block:
Iterating over enumerations and arrays using blocks:
A method such as inject:into: can accept both a parameter and a block. It iterates over each member of a list, performing some function on while retaining an aggregate. This is analogous to the foldl function in functional programming languages. For example:
On the first pass, the block receives 10 (the argument to inject) as sum, and 1 (the first element of the array) as element, This returns 11. 11 then becomes sum on the next pass, which is added to 3 to get 14. 14 is then added to 5, to finally return 19.
Blocks work with many built-in methods:
Using an enumeration and a block to square the numbers 1 to 10:
The following code defines a class named Person. By deriving from Magnitude, it automatically defines all comparison methods except one (<). With the addition of that one, asSortedCollection can sort by age. Note that we can override the way the object is printed/displayed (the default is to share the programmer-print and user-display representation) by overriding printOn:.
The above prints three names in reverse age order:
An exception is raised with a halt call:
An optional message can be added to the exception; there's also error: which raises a different kind of exception:
These are actually wrappers for the actual exception raising method, signal:
Exceptions are handled by on:do: blocks.
Of course you can catch only particular exceptions (and their subclasses):
It is possible to use the exception object, which is made available to the handler clause, to exit or resume the first block; exiting is the default, but can also be mentioned explicitly: