**Help****- Glossary** - **B - Block**

Blocks are one of the beauties of Squeak. They idea is derived from **Lambda Calculus**, and comes to this: Any expression of Squeak that Squeak can evaluate can be put inside a block with variables. The block then can be used as a function and called with appropriate values. Here are two simple examples you can use with **Cmd-p**:

**[:x | 2*x] value: 25.
[:x :y | x squared + y squared] value: 3 value: 4.**

This is a great tool for programming.

What's inside a block - marked by square brackets are - one or more Smalltalk expressions. A block is itself an expression, and returns its value when calculated. It also forms an object when assigned to a variable. Thus e.g.

**| doubler |
doubler := [:x | 2*x].
doubler value: 50**

The **parameters** of a block are the terms in it that occurs once more to the left of " **|** " with a prefixed colon to mark them as parameters.

Blocks themselves can have local variables as in

**| sum adder interim |
sum := 0.
adder := [:n | interim := sum+n. sum:= interim].
[sum < 11] whileTrue: [adder value: 1].
adder value: 1.
^sum
** Alternatively:

**| sum adder |
sum := 0.
adder := [:n | | interim | interim := sum+n. sum:= interim].
[sum < 11] whileTrue: [adder value: 1].
adder value: 1.
^sum**

And Blocks may be passed as parameters of methods. See e.g. **SortedCollection**.

It should be noted that Blocks in Squeak-as-is have a few shortcomings. These are too technical to list here, and in fact a new **virtual machine** has been designed that overcomes these shortcomings.