List of Figures

1.1 Functional decomposition 10
1.2 Comparison between imperative and functional style 19
1.3 Functional and imperative LIFE 24
1.4 I/O feedback model 27

2.1 Object-oriented taxonomy 30
2.2 Ideal inheritance 31
2.3 Classes as versions and variants 33
2.4 Subtyping inheritance 34
2.5 Dynamic method lookup 36

3.1 Screenshot: Opulus expression 49
3.2 Screenshot: Opulus expression represented in the l-calculus 49
3.3 Screenshot: l-calculus expression 51
3.4 Screenshot: l-calculus expression represented in Opulus 51

4.1 Classification of programming paradigms 56
4.2 Cooking with object responsibility 60
4.3 Cooking with single inheritance 61
4.4 Cooking with multiple inheritance 61
4.5 Cooking with repeated inheritance 62
4.6 Cooking with parameterization 63
4.7 Cooking with synergy 63
4.8 Restructured dependencies 67

5.1 A composer's pattern 70
5.2 Space filling pattern 73
5.3 Software system of interwoven patterns 77
5.4 OMT Notation: Class diagram 80
5.5 OMT Notation: Object diagram 81
5.6 OMT Notation: Interaction diagram 81

7.1 Function Object structure diagram 100
7.2 Function Object interaction diagram 101

8.1 Schematic CD-player 116
8.2 Plug-in modules in a bitstream architecture 116
8.3 Generating hamming numbers 118
8.4 Structure diagram 121
8.5 Interaction diagram 122
8.6 Definition of an Anamorphism 128
8.7 Natural number stream 130
8.8 Using streams 131
8.9 Suspension of a stream tail 134
8.10 Streamfunction unfolding 135
8.11 Streamvalue insertion 136
8.12 Stream of primes 137
8.13 Unfolded primes 138
8.14 Expanding the sieve 141
8.15 Normalized sieve 142
8.16 Sample structure 146
8.17 Stream structure diagram 147

9.1 Providing a "const" interface 151
9.2 Structure diagram 154
9.3 Interaction diagram 155
9.4 Optional mutators for Value Object 158
9.5 Copy strategies 159

10.1 Code example "Goodbye Mariner" 166
10.2 Iteration topology with lazy streams and Transfold 168
10.3 Iteration of two aggregates in lock-step 169
10.4 Transposing lists 170
10.5 Computing a list of products 170
10.6 Transmapping equality 171
10.7 Transfolding the inner product of a matrix 172
10.8 Minor axis matrix transposition 173
10.9 Transformation chain 173
10.10 Structure diagram 174
10.11 Interaction diagram 176
10.12 Inner product application 182
10.13 Matrix multiplication with a magic square 186

11.1 Code example: Robust behavior 190
11.2 Empty tree as void value 190
11.3 Code example: Null iterator 191
11.4 Code example: Default Behavior 191
11.5 Code example: Base case definition 191
11.6 Code example: Case distribution 192
11.7 Void Value structure diagram 193
11.8 Automatic reference initialization 196

12.1 Homomorphic translations of trees 200
12.2 Generic interpretation on an abstract syntax tree 202
12.3 Sample structure 203
12.4 Structure diagram 204
12.5 Interaction diagram 206
12.6 Distinct interpretation phases 207
12.7 Splitting the interpretation 208
12.8 Non-interfering semantics 209

13.1 Pattern categorization 220
13.2 Pattern implementation relations 221
13.3 Pattern collaborations 222
13.4 Pattern system relations 224
13.5 Functional pattern decomposition of "Samefringe" 227

14.1 Code example: Initialization 249
14.2 Hierarchical tiles editing 255

E.1 Pattern Cathedral 261
E.2 Paradigm integration with patterns 265