100% found this document useful (3 votes)
144 views

Functional and Concurrent Programming Core Concepts and Features 1st Edition Charpentier 2024 Scribd Download

Programming

Uploaded by

badoycela
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (3 votes)
144 views

Functional and Concurrent Programming Core Concepts and Features 1st Edition Charpentier 2024 Scribd Download

Programming

Uploaded by

badoycela
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 62

Download the full version of the textbook now at textbookfull.

com

Functional and Concurrent Programming Core


Concepts and Features 1st Edition Charpentier

https://textbookfull.com/product/functional-and-
concurrent-programming-core-concepts-and-
features-1st-edition-charpentier/

Explore and download more textbook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Learning Concurrent Programming in Scala Prokopec

https://textbookfull.com/product/learning-concurrent-programming-in-
scala-prokopec/

textbookfull.com

Beginning Functional JavaScript: Uncover the Concepts of


Functional Programming with EcmaScript 8 2nd Edition
Srikanth Machiraju
https://textbookfull.com/product/beginning-functional-javascript-
uncover-the-concepts-of-functional-programming-with-ecmascript-8-2nd-
edition-srikanth-machiraju/
textbookfull.com

Learning concurrent programming in Scala learn the art of


building intricate modern scalable and concurrent
applications using Scala Second Edition Prokopec
https://textbookfull.com/product/learning-concurrent-programming-in-
scala-learn-the-art-of-building-intricate-modern-scalable-and-
concurrent-applications-using-scala-second-edition-prokopec/
textbookfull.com

Miller’s Review of Orthopaedics 7th Edition Mark Miller

https://textbookfull.com/product/millers-review-of-orthopaedics-7th-
edition-mark-miller/

textbookfull.com
Ayahuasca Journals A Journey Through Impossible Realms
James O’Reilly

https://textbookfull.com/product/ayahuasca-journals-a-journey-through-
impossible-realms-james-oreilly/

textbookfull.com

Web and Internet Economics 16th International Conference


WINE 2020 Beijing China December 7 11 2020 Proceedings
Xujin Chen
https://textbookfull.com/product/web-and-internet-economics-16th-
international-conference-wine-2020-beijing-china-
december-7-11-2020-proceedings-xujin-chen/
textbookfull.com

Publication Manual of the American Psychological


Association - 7th Edition Coll.

https://textbookfull.com/product/publication-manual-of-the-american-
psychological-association-7th-edition-coll/

textbookfull.com

Is Entrepreneurship Dead The Truth about Startups in


America Scott A. Shane

https://textbookfull.com/product/is-entrepreneurship-dead-the-truth-
about-startups-in-america-scott-a-shane/

textbookfull.com

Intellectual Property and Financing Strategies for


Technology Startups 1st Edition Gerald B. Halt Jr.

https://textbookfull.com/product/intellectual-property-and-financing-
strategies-for-technology-startups-1st-edition-gerald-b-halt-jr/

textbookfull.com
If I'm Being Honest 1st Edition Emily Wibberley & Austin
Siegemund-Broka [Wibberley

https://textbookfull.com/product/if-im-being-honest-1st-edition-emily-
wibberley-austin-siegemund-broka-wibberley/

textbookfull.com
Functional and Concurrent
Programming
This page intentionally left blank
Functional and Concurrent
Programming

Core Concepts and Features

Michel Charpentier

Boston • Columbus • New York • San Francisco • Amsterdam • Cape Town


Dubai • London • Madrid • Milan • Munich • Paris • Montreal • Toronto • Delhi • Mexico City
Sao Paulo • Sidney • Hong Kong • Seoul • Singapore • Taipei • Tokyo
Cover Image: echo3005 / Shutterstock

Many of the designations used by manufacturers and sellers to distinguish their products are claimed as
trademarks. Where those designations appear in this book, and the publisher was aware of a trademark
claim, the designations have been printed with initial capital letters or in all capitals.

The author and publisher have taken care in the preparation of this book, but make no expressed
or implied warranty of any kind and assume no responsibility for errors or omissions. No liability is
assumed for incidental or consequential damages in connection with or arising out of the use of the
information or programs contained herein.

For information about buying this title in bulk quantities, or for special sales opportunities (which
may include electronic versions; custom cover designs; and content particular to your business, training
goals, marketing focus, or branding interests), please contact our corporate sales department at corpsales
@pearsoned.com or (800) 382-3419.

For government sales inquiries, please contact [email protected].

For questions about sales outside the United States, please contact [email protected].

Visit us on the Web: informit.com/aw

Library of Congress Number: 2022946382


Copyright © 2023 Pearson Education, Inc.

All rights reserved. This publication is protected by copyright, and permission must be obtained from
the publisher prior to any prohibited reproduction, storage in a retrieval system, or transmission in any
form or by any means, electronic, mechanical, photocopying, recording, or likewise. For information re-
garding permissions, request forms and the appropriate contacts within the Pearson Education Global
Rights & Permissions Department, please visit www.pearson.com.

ISBN-13: 978-0-13-746654-2
ISBN-10: 0-13-746654-4

ScoutAutomatedPrintCode
To Karen and Andre
This page intentionally left blank
Contents

Foreword by Cay Horstmann xxiii

Preface xxv

Acknowledgments xxxv

About the Author xxxvii

Part I Functional Programming 1


Chapter 1 Concepts of Functional Programming 3
1.1 What Is Functional Programming? 3
1.2 Functions 4
1.3 From Functions to Functional Programming Concepts 6
1.4 Summary 7

Chapter 2 Functions in Programming Languages 9


2.1 Defining Functions 9
2.2 Composing Functions 10
2.3 Functions Defined as Methods 12
2.4 Operators Defined as Methods 12
2.5 Extension Methods 13
2.6 Local Functions 14
2.7 Repeated Arguments 15
2.8 Optional Arguments 16
2.9 Named Arguments 16
2.10 Type Parameters 17
2.11 Summary 19

Chapter 3 Immutability 21
3.1 Pure and Impure Functions 21
3.2 Actions 23
3.3 Expressions Versus Statements 25
3.4 Functional Variables 26

vii
viii Contents

3.5 Immutable Objects 28


3.6 Implementation of Mutable State 29
3.7 Functional Lists 31
3.8 Hybrid Designs 32
3.9 Updating Collections of Mutable/Immutable Objects 35
3.10 Summary 36

Chapter 4 Case Study: Active–Passive Sets 39


4.1 Object-Oriented Design 39
4.2 Functional Values 41
4.3 Functional Objects 43
4.4 Summary 44

Chapter 5 Pattern Matching and Algebraic Data Types 47


5.1 Functional Switch 47
5.2 Tuples 48
5.3 Options 50
5.4 Revisiting Functional Lists 51
5.5 Trees 53
5.6 Illustration: List Zipper 56
5.7 Extractors 59
5.8 Summary 60

Chapter 6 Recursive Programming 63


6.1 The Need for Recursion 63
6.2 Recursive Algorithms 65
6.3 Key Principles of Recursive Algorithms 67
6.4 Recursive Structures 69
6.5 Tail Recursion 71
6.6 Examples of Tail Recursive Functions 73
6.7 Summary 77

Chapter 7 Recursion on Lists 79


7.1 Recursive Algorithms as Equalities 79
7.2 Traversing Lists 80
7.3 Returning Lists 82
7.4 Building Lists from the Execution Stack 84
7.5 Recursion on Multiple/Nested Lists 85
7.6 Recursion on Sublists Other Than the Tail 88
7.7 Building Lists in Reverse Order 90
7.8 Illustration: Sorting 92
7.9 Building Lists Efficiently 94
7.10 Summary 96

Chapter 8 Case Study: Binary Search Trees 99


8.1 Binary Search Trees 99
8.2 Sets of Integers as Binary Search Trees 100
Contents ix

8.3 Implementation Without Rebalancing 102


8.4 Self-Balancing Trees 107
8.5 Summary 113

Chapter 9 Higher-Order Functions 115


9.1 Functions as Values 115
9.2 Currying 118
9.3 Function Literals 120
9.4 Functions Versus Methods 123
9.5 Single-Abstract-Method Interfaces 124
9.6 Partial Application 125
9.7 Closures 130
9.8 Inversion of Control 133
9.9 Summary 133

Chapter 10 Standard Higher-Order Functions 137


10.1 Functions with Predicate Arguments 137
10.2 map and foreach 140
10.3 flatMap 141
10.4 fold and reduce 146
10.5 iterate, tabulate, and unfold 148
10.6 sortWith, sortBy, maxBy, and minBy 149
10.7 groupBy and groupMap 150
10.8 Implementing Standard Higher-Order Functions 152
10.9 foreach, map, flatMap, and for-Comprehensions 153
10.10 Summary 155

Chapter 11 Case Study: File Systems as Trees 157


11.1 Design Overview 157
11.2 A Node-Searching Helper Function 158
11.3 String Representation 158
11.4 Building Trees 160
11.5 Querying 164
11.6 Navigation 168
11.7 Tree Zipper 169
11.8 Summary 172

Chapter 12 Lazy Evaluation 173


12.1 Delayed Evaluation of Arguments 173
12.2 By-Name Arguments 174
12.3 Control Abstraction 176
12.4 Internal Domain-Specific Languages 179
12.5 Streams as Lazily Evaluated Lists 180
12.6 Streams as Pipelines 182
12.7 Streams as Infinite Data Structures 184
12.8 Iterators 184
12.9 Lists, Streams, Iterators, and Views 187
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
x Contents

12.10 Delayed Evaluation of Fields and Local Variables 190


12.11 Illustration: Subset-Sum 191
12.12 Summary 193

Chapter 13 Handling Failures 195


13.1 Exceptions and Special Values 195
13.2 Using Option 197
13.3 Using Try 198
13.4 Using Either 199
13.5 Higher-Order Functions and Pipelines 201
13.6 Summary 204

Chapter 14 Case Study: Trampolines 205


14.1 Tail-Call Optimization 205
14.2 Trampolines for Tail-Calls 206
14.3 Tail-Call Optimization in Java 207
14.4 Dealing with Non-Tail-Calls 209
14.5 Summary 213

A Brief Interlude 215


Chapter 15 Types (and Related Concepts) 217
15.1 Typing Strategies 217
15.2 Types as Sets 222
15.3 Types as Services 223
15.4 Abstract Data Types 224
15.5 Type Inference 225
15.6 Subtypes 229
15.7 Polymorphism 232
15.8 Type Variance 235
15.9 Type Bounds 241
15.10 Type Classes 245
15.11 Summary 250

Part II Concurrent Programming 253


Chapter 16 Concepts of Concurrent Programming 255
16.1 Non-sequential Programs 255
16.2 Concurrent Programming Concepts 258
16.3 Summary 259

Chapter 17 Threads and Nondeterminism 261


17.1 Threads of Execution 261
17.2 Creating Threads Using Lambda Expressions 263
17.3 Nondeterminism of Multithreaded Programs 263
Contents xi

17.4 Thread Termination 264


17.5 Testing and Debugging Multithreaded Programs 266
17.6 Summary 268

Chapter 18 Atomicity and Locking 271


18.1 Atomicity 271
18.2 Non-atomic Operations 273
18.3 Atomic Operations and Non-atomic Composition 274
18.4 Locking 278
18.5 Intrinsic Locks 279
18.6 Choosing Locking Targets 281
18.7 Summary 283

Chapter 19 Thread-Safe Objects 285


19.1 Immutable Objects 285
19.2 Encapsulating Synchronization Policies 286
19.3 Avoiding Reference Escape 288
19.4 Public and Private Locks 289
19.5 Leveraging Immutable Types 290
19.6 Thread-Safety 293
19.7 Summary 295

Chapter 20 Case Study: Thread-Safe Queue 297


20.1 Queues as Pairs of Lists 297
20.2 Single Public Lock Implementation 298
20.3 Single Private Lock Implementation 301
20.4 Applying Lock Splitting 303
20.5 Summary 305

Chapter 21 Thread Pools 307


21.1 Fire-and-Forget Asynchronous Execution 307
21.2 Illustration: Parallel Server 309
21.3 Different Types of Thread Pools 312
21.4 Parallel Collections 314
21.5 Summary 318

Chapter 22 Synchronization 321


22.1 Illustration of the Need for Synchronization 321
22.2 Synchronizers 324
22.3 Deadlocks 325
22.4 Debugging Deadlocks with Thread Dumps 328
22.5 The Java Memory Model 330
22.6 Summary 335

Chapter 23 Common Synchronizers 337


23.1 Locks 337
23.2 Latches and Barriers 339
xii Contents

23.3 Semaphores 341


23.4 Conditions 343
23.5 Blocking Queues 349
23.6 Summary 353

Chapter 24 Case Study: Parallel Execution 355


24.1 Sequential Reference Implementation 355
24.2 One New Thread per Task 356
24.3 Bounded Number of Threads 357
24.4 Dedicated Thread Pool 359
24.5 Shared Thread Pool 360
24.6 Bounded Thread Pool 361
24.7 Parallel Collections 362
24.8 Asynchronous Task Submission Using Conditions 362
24.9 Two-Semaphore Implementation 367
24.10 Summary 368

Chapter 25 Futures and Promises 369


25.1 Functional Tasks 369
25.2 Futures as Synchronizers 371
25.3 Timeouts, Failures, and Cancellation 374
25.4 Future Variants 375
25.5 Promises 375
25.6 Illustration: Thread-Safe Caching 377
25.7 Summary 380

Chapter 26 Functional-Concurrent Programming 381


26.1 Correctness and Performance Issues with Blocking 381
26.2 Callbacks 384
26.3 Higher-Order Functions on Futures 385
26.4 Function flatMap on Futures 388
26.5 Illustration: Parallel Server Revisited 390
26.6 Functional-Concurrent Programming Patterns 393
26.7 Summary 397

Chapter 27 Minimizing Thread Blocking 399


27.1 Atomic Operations 399
27.2 Lock-Free Data Structures 402
27.3 Fork/Join Pools 405
27.4 Asynchronous Programming 406
27.5 Actors 407
27.6 Reactive Streams 411
27.7 Non-blocking Synchronization 412
27.8 Summary 414
Contents xiii

Chapter 28 Case Study: Parallel Strategies 417


28.1 Problem Definition 417
28.2 Sequential Implementation with Timeout 419
28.3 Parallel Implementation Using invokeAny 420
28.4 Parallel Implementation Using CompletionService 421
28.5 Asynchronous Implementation with Scala Futures 422
28.6 Asynchronous Implementation with CompletableFuture 426
28.7 Caching Results from Strategies 427
28.8 Summary 431

Appendix A Features of Java and Kotlin 433


A.1 Functions in Java and Kotlin 433
A.2 Immutability 436
A.3 Pattern Matching and Algebraic Data Types 437
A.4 Recursive Programming 439
A.5 Higher-Order Functions 440
A.6 Lazy Evaluation 446
A.7 Handling Failures 449
A.8 Types 451
A.9 Threads 453
A.10 Atomicity and Locking 454
A.11 Thread-Safe Objects 455
A.12 Thread Pools 457
A.13 Synchronization 459
A.14 Futures and Functional-Concurrent Programming 460
A.15 Minimizing Thread Blocking 461

Glossary 463

Index 469
This page intentionally left blank
List of Listings
2.1 Example of a method defined with a symbolic name. 13
2.2 Example of a method defined for infix invocation. 13
2.3 Example of a method added to a type by extension. 14
2.4 Example of a local function defined within another function. 14
2.5 Example of a function with variable-length arguments. 15
2.6 Example of a function with default values for some of its arguments. 16
2.7 Example of a function parameterized by a type; contrast with Lis. 2.8. 18
2.8 Example of parameterization by multiple types; contrast with Lis. 2.7. 19

3.1 Pure function versus impure function versus action. 24


3.2 Example of if-then-else as a statement; contrast with Lis. 3.3. 25
3.3 Example of if-then-else as an expression; contrast with Lis. 3.2. 26
3.4 A directory as a mutable set; contrast with Lis. 3.5. 33
3.5 A directory as an immutable set; contrast with Lis. 3.4. 34
3.6 Example of a mutable type; contrast with Lis. 3.7. 35
3.7 Example of an immutable type; contrast with Lis. 3.6. 35

4.1 Object-oriented active-passive sets, using underlying mutable sets. 39


4.2 Object-oriented active-passive sets, using underlying immutable sets. 40
4.3 Functional active–passive sets. 41
4.4 Functional–object-oriented active–passive sets. 43

5.1 Example of pattern matching used as a switch expression. 47


5.2 Example of pattern matching with guards. 48
5.3 Example of pattern matching for type testing/casting. 48
5.4 Example of pattern matching to extract tuple elements. 49
5.5 Example of pattern matching to both switch and extract. 50
5.6 Reimplementing head and tail using pattern matching. 51
5.7 Reimplementing isEmpty using pattern matching. 52
5.8 Boolean expressions as an algebraic data type. 54
5.9 Recursive evaluation of Boolean expressions using pattern matching. 54
5.10 List zipper definition and construction. 57
5.11 List zipper getting and setting. 58
5.12 List zipper navigation. 58
5.13 Conversion from list zipper to list. 59

xv
xvi List of Listings

5.14 Example of an extractor (RGB values). 59


5.15 Example pattern matching on a regular expression. 60

6.1 Nesting function calls through recursion. 64


6.2 Recursive implementation of factorial; contrast with Lis. 6.11. 65
6.3 Recursive solution to the Tower of Hanoi problem. 66
6.4 Incorrect implementation of last; fixed in Lis. 6.10. 68
6.5 Incorrect merge sort; fixed in Lis. 7.18. 68
6.6 Ackermann function. 69
6.7 Recursive implementation of size on binary trees. 70
6.8 Recursive implementation of size on N -ary trees. 70
6.9 Tail recursive implementation of binary search in a sorted sequence. 74
6.10 Correct tail recursive implementation of last; fixed from Lis. 6.4. 75
6.11 Tail recursive implementation of factorial; contrast with Lis. 6.2. 75
6.12 Tail recursive implementation of size on binary trees. 76

7.1 Simple list lookup, using tail recursion; see also Lis. 7.2. 80
7.2 Simple list lookup, using tail recursion and pattern matching. 81
7.3 List length, not tail recursive; contrast with Lis. 7.4. 81
7.4 List length, using tail recursion; contrast with Lis. 7.3. 82
7.5 Recursive implementation of drop on lists; see also Lis. 7.6. 82
7.6 Recursive implementation of drop on lists; see also Lis. 7.5. 83
7.7 Implementation of getAt on lists, using drop. 84
7.8 Recursive implementation of take; contrast with Listings 7.21 to 7.23. 84
7.9 Recursive implementation of list concatenation. 86
7.10 Appending at the end of a list using concatenation. 86
7.11 Recursive implementation of list flattening. 87
7.12 Recursive implementation of list zipping. 88
7.13 Recursive implementation of list splitting. 89
7.14 Recursive implementation of list grouping. 89
7.15 Linear, tail recursive implementation of list reversal. 90
7.16 List building by prepending and reversing instead of appending. 91
7.17 Insertion sort. 92
7.18 Merge-sort; fixed from Lis. 6.5; see also Lis. 7.19. 93
7.19 Alternative implementation of merge-sort; see also Lis. 7.18. 93
7.20 Quick-sort with user-defined splitting; see also Lis. 10.1. 94
7.21 Tail recursive implementation of take; contrast with Lis. 7.8. 94
7.22 Buffer-based implementation of take; contrast with Lis. 7.21. 95
7.23 Loop-based implementation of take; contrast with Lis. 7.22. 95

8.1 Empty binary search tree. 102


8.2 Querying methods on binary search trees. 102
8.3 Key insertion in binary search trees. 103
8.4 Key deletion in binary search trees. 104
8.5 Conversion from binary search trees to sorted lists. 106
List of Listings xvii

8.6 Set conversion to balanced binary search trees, improved in Lis. 8.12. 107
8.7 Left and right rotations on binary search trees. 109
8.8 Rebalancing of binary search trees by rotations. 110
8.9 Key insertion in self-balancing binary search trees. 111
8.10 Key deletion in self-balancing binary search trees; see also Lis. 8.11. 111
8.11 Key deletion in self-balancing binary search trees; see also Lis. 8.10. 112
8.12 Conversion from set to binary search trees, improved from Lis. 8.6. 112

9.1 List lookup for a specific target. 115


9.2 Recursive implementation of higher-order function find. 116
9.3 Example of a function that returns a function; see also Lis. 9.4 and 9.5. 117
9.4 Example of higher-order functions defined through currying. 118
9.5 Example of higher-order functions defined using lambda expressions. 121
9.6 Memoization using closures; see also Lis. 12.2. 130
9.7 Example of a function writing in its closure. 131

10.1 Quick-sort, using partition. 139


10.2 Implementation of find using dropWhile. 139
10.3 Using flatMap to implement map and filter. 142
10.4 Processing options through pattern matching; contrast with Lis. 10.5. 142
10.5 Example of using flatMap in a pipeline; see also Lis. 10.9. 143
10.6 Example of iteration, recursion, and fold for the same computation. 146
10.7 sum, product, reverse, and filter implemented using fold. 147
10.8 Extending binary search trees with exists, foreach, and fold. 152
10.9 Rewritten pipeline from Lis. 10.5 using for-comprehension. 153

11.1 Example of using foreach with a mutable string builder. 160


11.2 Example of node insertion in a general tree. 161
11.3 Example of node removal in a general tree. 163
11.4 Example of using fold to count nodes in a general tree. 164
11.5 Example of implementing exists on a general tree. 164
11.6 Example of implementing fold on a general tree. 165
11.7 Example of implementing find on a general tree. 168
11.8 Navigation methods in a tree zipper (1). 171
11.9 Navigation methods in a tree zipper (2). 171

12.1 Reimplementing List.fill. 175


12.2 Memoization uisng a by-name argument, improved from Lis. 9.6. 176
12.3 Control abstraction example: function timeOf. 177
12.4 Control abstraction example: function times. 178
12.5 Control abstraction example: repeat-until. 178
12.6 Tower of Hanoi moves as a list; contrast with Lis. 12.7. 181
12.7 Tower of Hanoi moves as a stream. 182
12.8 Imperative implementation of the 3n + 1 sequence. 185
12.9 Functional implementation of the 3n + 1 sequence. 186
12.10 Recursive implementation of subset-sum; see also Lis. 12.11. 191
xviii List of Listings

12.11 All the solutions to subset-sum; contrast with Lis. 12.10 and 12.12. 192
12.12 The solutions to subset-sum derived lazily; contrast with Lis. 12.11. 192

13.1 Pipeline example with no handling of failures; contrast with Lis. 13.2. 201
13.2 Pipeline example with failure handling; contrast with Lis. 13.1. 202

14.1 Example of non-optimized tail-calls; contrast with Lis. 14.3. 205


14.2 Trampoline for tail-call optimization in Scala. 206
14.3 Optimized tail-calls, using a trampoline; contrast with Lis. 14.1. 207
14.4 Trampoline for tail-call optimization in Java. 208
14.5 Optimized tail-calls, using a trampoline, Java variant. 208
14.6 Trampoline extended with map and flatMap. 211
14.7 Non-tail recursive factorial, as a trampoline; see also Lis. 14.10. 212
14.8 Non-tail recursive size on trees, as a trampoline; see also Lis. 14.10. 212
14.9 Non-tail recursive hanoi, as a trampoline; see also Lis. 14.10. 212
14.10 For-yield on trampolines; contrast with Lis. 14.7 to 14.9. 213

15.1 Example of ad hoc polymorphism. 232


15.2 Example of parametric polymorphism. 233
15.3 Example of subtype polymorphism; see also Lis. 15.4. 233
15.4 Using subtype polymorphism to process a heterogeneous collection. 234
15.5 Example of a user-defined covariant type. 238
15.6 Example of a user-defined contravariant type. 239
15.7 Example of an upper type bound for use-site variance. 241
15.8 Example of a lower type bound for use-site variance. 242
15.9 Example of a type parameter with both lower and upper bounds. 242
15.10 Example of a combined upper type bound; contrast with Lis. 15.14. 243
15.11 Using type bounds on non-variant types for increased flexibility. 244
15.12 Example of a structural type in Scala. 245
15.13 Example of polymorphism through a type class. 247
15.14 Example of combining type bounds and type classes for flexibility. 248
15.15 An averaging function based on a type class. 249

17.1 Example of a multithreaded program. 262


17.2 Example of creating threads using lambda expressions. 263
17.3 Requesting thread termination using a volatile flag. 265
17.4 Waiting for thread termination without a timeout; see also Lis. 17.5. 266
17.5 Waiting for thread termination with a timeout. 266

18.1 Multiple threads share an integer unsafely. 271


18.2 Multiple threads share a list unsafely; fixed in Lis. 18.5. 273
18.3 Using an AtomicInteger to generate unique values. 276
18.4 Example of non-atomic check-then-act; fixed in Lis. 18.7. 276
18.5 Multiple threads share a list safely; fixed from Lis. 18.2. 280
18.6 Illustration of lock reentrancy. 281
18.7 Atomic check-then-act using locking; fixed from Lis. 18.4. 282
List of Listings xix

19.1 Example of threads freely sharing immutable objects. 285


19.2 Safe list that encapsulates synchronization; contrast with Lis. 18.5. 287
19.3 Example of client-side locking. 289
19.4 Safe list based on a private lock; contrast with Lis. 19.2. 290
19.5 Safe list based on an immutable list; contrast with Lis. 19.2 and 19.4. 291
19.6 Safe list with an immutable list/private lock; contrast with Lis. 19.5. 293

20.1 Thread-safe queue (single public lock); see also Lis. 20.5 and 20.7. 298
20.2 Batch insertions by client-side locking on a concurrent queue. 299
20.3 Batch extraction by client-side locking on a concurrent queue. 300
20.4 Batch extraction without synchronization; contrast with Lis. 20.3. 300
20.5 Thread-safe queue (single private lock); see also Lis. 20.1 and 20.7. 301
20.6 Batch processing from queue with a private lock. 302
20.7 Thread-safe queue (two private locks); see also Lis. 20.1 and 20.5. 303
20.8 Batch processing from a queue with a split lock. 304

21.1 Example concurrency from a thread pool; contrast with Lis. 17.1. 307
21.2 Using a thread pool to create threads and wait for their termination. 309
21.3 A server that processes requests sequentially; contrast with Lis. 21.4. 310
21.4 A server that processes requests concurrently; contrast with Lis. 21.3. 310
21.5 Example of scheduled execution using a timer pool. 313
21.6 Example of parallel evaluation of higher-order function map. 316

22.1 Threads from a pool share a safe list. 321


22.2 Waiting for task completion using a countdown latch synchronizer. 325
22.3 Deadlock-prone implementation of a box; fixed in Lis. 22.4. 326
22.4 Thread-safe box with a latch; fixed from Lis. 22.3; see also Lis. 27.2. 327
22.5 First variant for method set from Lis. 22.4. 328
22.6 Second variant for method set from Lis. 22.4. 328
22.7 Example of events tied and not tied by happens-before; see Fig. 22.4. 332
22.8 Possible implementation of get in Lis. 22.4 and 22.6. 334

23.1 Variant of Lis. 18.7 with a timeout. 337


23.2 Example use of a read-write lock. 338
23.3 Add latches to Lis. 21.2 for increased concurrency and precise timing. 339
23.4 Replace two latches from Lis. 23.3 with a single barrier. 340
23.5 Simple lock implementation using a semaphore. 341
23.6 Bounded queue based on two semaphores; see also Lis. 23.7 and 23.8. 342
23.7 Bounded queue with a single condition; see also Lis. 23.8. 343
23.8 Bounded queue based on two conditions. 345
23.9 Searching files and storing results as a producer–consumer pattern. 353

24.1 Parallel execution: one new thread per task. 356


24.2 Parallel execution: bounded number of threads. 358
24.3 Parallel execution: dedicated thread pool. 359
24.4 Parallel execution: shared thread pool. 360
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
xx List of Listings

24.5 Parallel execution: shared thread pool with a bound. 361


24.6 Parallel execution: parallel collections. 362
24.7 Extensible parallel execution using a single condition. 363
24.8 Extensible parallel execution using two conditions. 366
24.9 Extensible parallel execution using two semaphores. 367

25.1 Value-producing tasks handled as futures. 371


25.2 A parallel server with parallelism within responses; see also Lis. 26.8. 373
25.3 Dealing with a future’s timeout and failure. 374
25.4 Possible implementation of Future.apply; see also Lis. 25.5 and 25.6. 376
25.5 Future creation from a CompletableFuture promise. 376
25.6 Future creation from a FutureTask promise. 377
25.7 A thread-safe memoization function, using promises and futures. 379

26.1 Deadlock-prone parallel quick-sort; see also Lis. 26.5. 381


26.2 Ad-fetching example; contrast with Lis. 26.3, 26.6, and 26.7. 383
26.3 Ad-fetching example with a callback on a future. 385
26.4 Reimplementing higher-order function map on futures. 387
26.5 Non-blocking implementation of parallel quick-sort. 389
26.6 Ad-fetching example with map and foreach on futures. 390
26.7 Ad-fetching example with flatMap and foreach on futures. 390
26.8 A fully non-blocking parallel server. 390
26.9 A pipeline of futures using flatMap. 394
26.10 Joining a list of CompletableFutures into one without blocking. 396

27.1 Conceptual implementation of class AtomicInteger in Java. 400


27.2 Thread-safe box with a latch and no lock. 401
27.3 Lock-free implementation of a thread-safe stack (Treiber’s algorithm). 403
27.4 Example of non-blocking concurency using ForkJoinPool. 405
27.5 Example of non-blocking concurrency with an async/await construct. 406
27.6 Example of non-blocking concurrency using Kotlin coroutines. 407
27.7 Example of non-blocking concurrency using actors. 408
27.8 Example of a state machine as an actor that switches behavior. 410
27.9 Example of non-blocking transformation using reactive streams. 411

28.1 A sequential runner of strategies with timeout. 419


28.2 A parallel runner of strategies based on invokeAny. 421
28.3 A parallel runner of strategies based on CompletionService. 422
28.4 Extending Scala futures with completeOnTimeout. 423
28.5 Earliest Scala future that satisfies a condition; see also Lis. 28.7. 424
28.6 A parallel asynchronous runner of strategies using Scala futures. 425
28.7 Earliest CompletableFuture that satisfies a condition. 426
28.8 Asynchronous runner variant based on CompletableFuture. 427
28.9 Asynchronous runner with thread-safe caching. 428
List of Figures
3.1 Functional lists memory sharing. 32

5.1 true ∧ (false ∨ ¬(true ∧ false)) as a tree. 53

6.1 Tower of Hanoi problem. 66

7.1 Recursive strategy for function drop. 82


7.2 Data sharing between list and drop(list, n). 83
7.3 Data copying between list and take(list, n). 85
7.4 Recursive strategy for function concat. 86
7.5 Recursive strategy for function flatten. 87

8.1 A binary search tree. 100


8.2 The binary search tree from Figure 8.1 after key 57 is removed. 105
8.3 Tree rotations. 109

11.1 A file system tree and its string representation. 159

15.1 Subtype relationship of two functions. 240

18.1 Possible interleaving of two increment operations. 273


18.2 Possible interleaving of two non-atomic compound actions. 275
18.3 Possible interleaving of two non-atomic check-then-act. 276

19.1 Possible interleaving of three SafeStringList.add operations. 292


19.2 Semantics of concurrency as interleaving of atomic actions. 294

20.1 FIFO queue implemented as two LIFO lists. 297


20.2 Possible interleaving of two ConcurrentQueue.take operations. 299
20.3 Possible deadlock due to an incorrect drain implementation in
ConcurrentQueue. 305

22.1 Possible deadlock of the incorrect box implementation in Lis. 22.3. 327
22.2 Single-threaded executions are sequentially consistent. 330
22.3 Multithreaded executions are not sequentially consistent. 331

xxi
xxii List of Figures

22.4 Happens-before graph for actions in Lis. 22.7. 333


22.5 Happens-before without explicit synchronization. 334

23.1 Deadlock scenario of a blocking queue, as discovered by a model-checker. 348

25.1 Flaw in a naive thread-safe memoization strategy. 378

26.1 Deadlock as a result of tasks created by tasks. 382


26.2 Activity dependencies in the server example. 391

27.1 Possible loss of value from concurrent calls to push on a stack. 403
27.2 Compare-and-set to push/pop a lock-free stack. 404
27.3 Message flow of actors in Lis. 27.7. 409
Foreword by Cay Horstmann
In my book Scala for the Impatient, I provide a rapid-fire introduction into the many
features of the Scala language and API. If you need to know how a particular feature
works, you will find a concise explanation and a minimal code example (with real code,
not fruits or animals). I assume that the reader is familiar with Java or a similar object-
oriented programming language and organize the material to maximize the experience
and intuition of such readers. In fact, I wrote the book because I was put off by the
learning materials at the time, which were disdainful of object-oriented programming
and biased toward functional programming as the superior paradigm.
That was more than a decade ago. Nowadays, functional techniques have become
much more mainstream, and it is widely recognized that the object-oriented and func-
tional paradigms complement each other. In this book, Michel Charpentier provides
an accessible introduction to functional and concurrent programming. Unlike my Scala
book, the material here is organized around concepts and techniques rather than lan-
guage features. Those concepts are developed quite a bit more deeply than they would
be in a book that is focused on a programming language. You will learn about nontrivial
and elegant techniques such as zippers and trampolines.
This book uses Scala 3 for most of its examples, which is a great choice. The concise
and elegant Scala syntax makes the concepts stand out without being obscured by a
thicket of notation. You will particularly notice that when the same concept is expressed
in Scala and in Java. You don’t need to know any Scala to get started, and only a modest
part of Scala is used in the code examples. Again, the focus of the book is concepts,
not programming language minutiae. Mastering these concepts will make you a better
programmer in any language, even if you never end up using Scala in your career.
I encourage you to actively work with the sample programs. Execute them, observe
their behavior, and experiment by making changes. I suggest that you use a program-
ming environment that supports Scala worksheets, such as Visual Studio Code, IntelliJ,
or the online Scastie service. With a worksheet, turnaround is quick and exploratory
programming is enjoyable.
Seven out of the 28 chapters are complete case studies that illustrate the material
that preceded them. They are chosen to be interesting without being overwhelming. I
am sure you will profit from working through them in detail.
The book is divided into two parts. The first part covers functional programming
with immutable data, algebraic data types, recursion, higher-order functions, and lazy
evaluation. Even if you are at first unexcited about reimplementing lists and trees, give
it a chance. Observe the contrast with traditional mutable data structures, and you
will find the journey rewarding. The book is blessedly free of complex category theory
that in my opinion—evidently shared by the author—requires a large amount of jargon
before yielding paltry gains.

xxiii
xxiv Foreword by Cay Horstmann

The focus of the second part is concurrent programming. Here too the organization
along concepts rather than language and API features is refreshing. Concurrent pro-
gramming is a complex subject with many distinct use cases and no obvious way of
teaching it well. Michel has broken down the material into an interesting and thought-
provoking sequence of chapters that is quite different from what you may have seen
before. As with the first part, the ultimate aim is not to teach you a specific set of skills
and techniques, but to make you think at a higher level about program design.
I enjoyed reading and working through this unique book and very much hope that
you will too.

Cay Horstmann
Berlin, 2022
Random documents with unrelated
content Scribd suggests to you:
»Mitä nyt?» kummasteli hän. »Eivätkö kuninkaan käskyläiset
kunnioita hurskautta eivätkä ikää, koska tunkeutuvat pyhän miehen
yksinäiseen asuntoon edes lupaa kysymättä?»

»Minä en ole kuninkaan käskyläinen», vastasi poika levollisesti.


»Olen Norman of Torn, minulla ei ole kuningasta eikä jumalaa, enkä
kysy lupaa ainoaltakaan ihmiseltä. Mutta olen tullut rauhallisissa
aikeissa, koska haluan puhella muidenkin kuin isäni kanssa.
Senvuoksi saatte te puhella kanssani», lopetti hän ylpeän käskevästi.

»Kautta Juhanan nenän, kuninkaanpa on täytynyt alentua


kunnioittamaan minua komennuksillaan», tokaisi pappi nauraen.
»Avatkaahan kypärinsilmikkonne, mylord! Kovin mielelläni näkisin
sen henkilön kasvot, joka lausuilee kuninkaallisia komennuksia.»

Pappi oli iso mies, hänellä oli ystävällisesti säteilevät silmät ja


pyöreät, rattoiset kasvot. Hänen hyväntahtoisen vastauksensa sävy
ei ollut lainkaan pureva, ja niinpä poika hymyillen aukaisi
silmikkonsa.

»Kautta Gabrielin korvan!» huudahti kunnon isä. »Lapsi


rautavarustuksissa!»

»Lapsi ikävuosiltaan kenties», vastasi poika, »mutta hyvä lapsi


sellaisen henkilön ystäväksi, jolla on miekkaa käytteleviä
vihamiehiä».

»Sitten me olemme ystävyksiä, Norman of Torn, sillä vaikka


minulla on vain vähän vihamiehiä, ei kenelläkään ole liiaksi ystäviä,
ja minä pidän kasvoistanne ja eleistänne, vaikka käytöksessänne
onkin paljon toivomisen varaa. Istuutukaa syömään kanssani! Minä
kyllä puhun niin paljon kuin sydämenne ikinä halajaa, sillä jos
mistään pidän enemmän kuin syömisestä, niin juuri puhumisesta.»

Papin avulla poika riisui rauta-asunsa, sillä se oli raskas ja


epämukava, ja he istuutuivat yhdessä aterialle, joka jo osittain oli
pöydässä.

Siten alkoi ystävyys, jota kesti niin kauan kuin kelpo pappi eli.
Milloin Norman of Tornin vain sopi, kävi hän katsomassa ystäväänsä
isä Claudea. Juuri tämä se opetti pojan lukemaan ja kirjoittamaan
ranskan-, englannin- ja latinankieltä sellaisena aikana, jolloin
ainoastaan harvat ylimykset osasivat kirjoittaa oman nimensä.

Hovissa ja korkeampien yhteiskuntaluokkien keskuudessa


puhuttiin melkein yksinomaan ranskaa, ja kaikki julkiset asiakirjat
kirjoitettiin joko ranskan- tai latinankielellä, vaikka näihin aikoihin
Englannin kuningas julkaisi ensimmäisen englanninkielisen,
alamaisilleen osoitetun julistuksen.

Isä Claude opetti poikaa pitämään arvossa muiden oikeuksia,


puolustamaan köyhiä ja sorrettuja, kunnioittamaan Jumalaa ja
uskomaan, että miehen olemassaolon tärkein syy oli naisten
suojeleminen. Kaikki ne hyveet, kaiken ritarillisuuden ja todellisen
miehuuden, joita pojan vanha holhooja ei ollut välittänyt juurruttaa
pojan mieleen, istutti tämä kunnon pappi sinne, mutta hän ei saanut
kitketyksi pois pojan sydämestä syvälle juurtunutta englantilaisvihaa
eikä sitä uskoa, että miehuuden oikea merkki oli halu taistella
miekka kädessä kuolemaan saakka.

Muuan pojan ensi kertoja käydessä uuden ystävänsä luona


sattunut tapaus osoitti viimemainitulle sangen selvästi, ettei hän
voisi esittää sellaisia perusteluja, jotka pystyisivät kumoamaan sen
alastoman tosiasian, että kelpo isä sai kiittää hyvin paljosta,
mahdollisesti hengestäänkin, juuri sitä pojan uskoa ja hänen
kykyään tukea sitä teoilla.

Heidän eräänä iltapäivänä istuessaan papin majassa koputettiin


rajusti ovelle, joka heti sysättiin auki, ja sisälle astui niin kunnoton
joukko lurjuksia kuin ihmisten katseita on ikinä vaivannut. Heitä oli
kuusi, he olivat puetut likaisiin nahka-asuihin, ja heidän kupeellaan
riippui miekkoja ja tikareja.

Johtaja oli valtaisen roteva miekkonen, jolla oli tuuhea ja


takkuinen, karkea, musta tukka ja pöhistyneet, melkein kokonaan
ison, mustan, vanuneen parran peitossa olevat kasvot. Hänen
takanaan tungeksi toinen jättiläinen, jolla oli punaiset hiukset ja
jäykästi törröttävät viikset; kolmannella oli merkkinä hirvittävä,
vasemman posken ja otsan ylitse ulottuva arpi muistona iskusta,
joka ilmeisesti oli riistänyt häneltä vasemman silmän, sillä sen
kuoppa oli tyhjä ja sisään painunut luomi peitti vain osittain silmän
jättämän onton kohdan tulehtuneen punaisen värin.

»Ahaa, veikkoset», karjui johtaja, kääntyen kirjavan joukkonsa


puoleen, »täällä onkin komea saalis. Jumalan syöttösika, meidän
kaltaisten köyhien, rehellisten pahuksien hiellä lihoitettu, ja nuori
teikari, jolla näöstä päättäen täytyy olla kultakolikoita vyössään.»

»Höpiskää rukouksenne, kyyhkyläiseni», jatkoi hän, rumasti


kiroten, »sillä Musta Susi ei jätä jälkeensä todistajia sitomaan
myöhemmin kaulaansa hirttosilmukkaa, ja vähimmän puhuvat
vainajat».

»Jos hän on Musta Susi», supatti isä Claude pojalle, »ei meille olisi
voinut pahemmin käydä, sillä hän ryöstää aina kirkonmiehiä ja
humalassa ollessaan, kuten hän nyt on, murhaa uhrinsa. Minä
heittäydyn heidän eteensä, ja te kiiruhdatte sillä aikaa, ratsunne
luokse ja pakenette.» Hän käytti ranskankieltä ja piti käsiään
rukousasennossa, joten hän johti täydelleen harhaan rosvot, jotka
eivät lainkaan aavistaneet hänen puhuvan pojalle.

Norman of Torn jaksoi tuskin pidättyä hymyilemästä iäkkään papin


ovelalle juonelle, otti saman asennon ja vastasi ranskaksi:

»Kelpo isä Claude ei tunne Norman of Tornia, jos luulee hänen


vanhan akan tavoin livistävän karkuun takaovesta, koska miekka
välkkyy etuovella.»

Sitten hän oikaisihe ja puhutteli roistoja.

»En tiedä, mitä kaunaa teillä on tätä hyvää ystävääni vastaan,


enkä välitäkään sitä tietää. Se riittää, että hän on Norman of Tornin
ystävä ja että Norman of Torn on täällä mieskohtaisesti
tunnustamassa ystävyyden velvoituksen. Kavahtakaa, suunnattoman
lian ja valtavan löyhkän ritarit!» Ja miekka kädessä hän ponnahti
pöydän ylitse, karaten ällistyneen johtajan kimppuun.

Pienessä huoneessa voi vain kaksi ahdistaa häntä kerrallaan, ja


hänen säilänsä heilui niin rajusti, ja hän suuntasi pistonsa niin
varmasti, että lyhyen hetkisen kuluttua Musta Susi virui kuolleena
lattialla ja Shandy, punapäinen jättiläinen, oli pahasti, vaikka ei
kuolettavasti haavoitettu. Neljä jäljelläolevaa roikaletta peräytyi
nopeasti majasta, ja varovaisempi taistelija olisi sallinut heidän
mennä rauhassa tiehensä, sillä avoimella paikalla on neljä yhtä
vastaan sellainen ylivoima, jota ei kukaan saa rankaisematta uhitella.
Mutta Norman of Tornin silmissä väikkyi punaista hänen
taistellessaan, ja se houkutteli häntä aina eteenpäin kuumimpaan
kahakkaan. Ainoastaan kerran ennen hän oli taistellut elämästä ja
kuolemasta, mutta se kerta oli opettanut hänet pitämään siitä, ja
hänen kuolemaansa saakka se oli hänen taistelutapansa ominainen
piirre, joten sekä ne, jotka kammosivat, vihasivat ja pelkäsivät häntä,
että ne, jotka häntä rakastivat, tunnustivat yksimielisesti, ettei
Jumala ollut milloinkaan ennen liittänyt samaan ihmiseen niin
verrattoman etevää miekkailu taitoa ja niin äärimmäistä
pelottomuutta.

Niinpä hän ei nytkään tyytynyt voittoonsa, vaan syöksyi majasta


neljän lurjuksen jäljessä. Ulkosalle päästyään he kääntyivät hänen
kimppuunsa, mutta hän juoksi heidän keskelleen viuhuville
miekkoineen, ja heistä tuntui kuin heidän vastassaan olisi ollut neljä
miestä eikä yksi ainoa; niin vikkelästi hän väisti ja pisti jollekin
suunnalle ja sivalsi vasta-iskun toisaalle. Hetkisessä oli yksi
menettänyt aseensa, toinen kaatunut ja jäljelläolevat kaksi
juoksemassa henkensä edestä maantielle päin Norman of Torn ihan
kinterillään.

Nuorena, ketteränä ja täysin terveenä hän voitti heidät juoksussa


yhtä hyvin kuin miekkailussakin, ja ennenkuin he olivat ennättäneet
harpata viittäkymmentä askelta, olivat he molemmat viskanneet pois
miekkansa ja langenneet polvilleen rukoilemaan häntä säästämään
heidän henkensä.

»Tulkaa takaisin kelpo papin majaan!» komensi Norman of Torn.


»Saamme siellä kuulla, mitä hän sanoo.»

Paluumatkalla he tapasivat sen miehen, joka oli menettänyt


aseensa, kumartuneena haavoittuneen kumppaninsa puoleen. He
olivat Flory-nimisiä veljeksiä, eikä toinen tahtonut jättää toista
avuttomaksi. Haavoittunut ei ilmeisestikään ollut hengenvaarassa,
minkä vuoksi Norman of Torn käski toisten auttaa hänet majaan,
jossa he tapasivat Punapää-Shandyn istumassa seinään
nojautuneena kelpo isän kaataessa pullon sisältöä hänen janoiseen
kurkkuunsa.

Roiston silmät ihan pullistuivat kuopistaan, kun hän näki neljän


kumppaninsa tulevan aseettomina vankeina takaisin pieneen
huoneeseen.

»Musta Susi vainajana, Punapää-Shandy ja John Flory


haavoittuneina,
James Flory, Silmäpuoli-Kanty ja Erakko-Peter vankeina!» kirkaisi
hän.

»Mies tai paholainen! Kautta paavin takajalan, kuka ja mikä


olette?» virkkoi hän, kääntyen Norman of Tornin puoleen.

»Olen isäntänne, ja te olette käskyläisiäni», vastasi Norman of


Torn. »Minua palvelette kunniallisemmassa työssä kuin omassa
valitsemassanne, mutta saatte taistelua yllin kyllin ja hyvän
palkkion.»

Kun poika näki tämän joukon roistoja, jotka olivat liittyneet yhteen
ryöstääkseen papistolta, heräsi pojan mielessä ajatus, joka oli
utuisen hämäränä pyörinyt hänen piilotajuntansa sisimmissä
sopukoissa aina siitä alkaen, kun hän voittamalla kolme ritaria oli niin
helposti saanut niin runsaan saaliin, hevosia, aseita, varustuksia ja
kultaa. Kuten aina hänen myöhemmän elämänsä aikana merkitsi
nytkin ajatus toimimista.

»Kun Musta Susi on kuollut — ja kiskokoon piru hänen silmänsä


kuopistaan punahehkuisilla pihdeillä! — saisimme ehkä etsiä
kauempaa ja meille saattaisi käydä huonommin, kumppanit,
etsiessämme päällikköä», puhkesi punapäinen Shandy puhumaan,
silmäillen tovereitaan, »sillä totisesti sellainen mies, vaikkapa hän
lieneekin vain pojanvekara, joka pystyy voittamaan kuusi
meikäläistä, sopii komentajaksemme».

»Entä millaiset olisivat velvollisuutemme?» kysyi Erakko-Peteriksi


nimitetty mies.

»Seurata Norman of Tornia, minne hän teitä johtaa, suojella


köyhiä ja heikkoja, olla valmiit uhraamaan henkenne
puolustaessanne naisia, ryöstää rikkailta englantilaisilta ja tehdä
haittaa Englannin kuninkaalle.»

Tämän uskollisuuslupauksen kaksi viimeistä pykälää miellyttivät


lurjuksia niin kovasti, että he olisivat olleet valmiit sitoutumaan mihin
tahansa, jopa jokapäiväiseen jumalanpalvelukseen ja peseytymiseen,
jos se olisi ollut välttämätöntä, päästäkseen Norman of Tornin
palvelukseen.

»Kyllä, kyllä!» huusivat he. »Olemme totisesti teidän väkeänne.»

»Malttakaahan», hillitsi Norman of Torn heitä, »on vielä muutakin.


Teidän tulee totella jokaista komennustani heti toteutettavan
kuolemanrangaistuksen uhalla, ja puolet kaikesta saaliistanne kuuluu
minulle. Minä puolestani vaatetan ja ruokin teitä, hankin teille ratsut,
varukset, aseet ja katon, jonka alla saatte nukkua, ja taistelen
puolestanne ja rinnallanne tällä kädelläni, joka, kuten tiedätte, ei
olekaan kehno turva. Suostutteko siihen?»

»Suostumme.» »Kauan eläköön Norman of Torn» »Tässä Tornien


päällikölle!» Ne lauseet olivat vantterien hirtehisten kerkeän
suostumuksen merkkinä.

»Vannokaa siis se, suudellen miekkani kahvaa ja tätä merkkiä!»


jatkoi
Norman of Torn, ottaen ristiinnaulitun kuvan papin pöydältä.

Tällaisilla menoilla perustettiin Tornin liitto, joka muutamissa


vuosissa paisui tuhatmiehiseksi, uhmasi kuninkaan armeijaa ja auttoi
Simon de Montfortia pääsemään Englannin todelliseksi hallitsijaksi.

Melkein heti alkoi sarja lähiseudun ylimyksiin ja niillä tienoin


sattumalta tavattuihin aatelisiin kohdistettuja, valtiopannan alaisia
tekoja, jotka täyttivät Norman of Tornin arkut kulta- ja
hopeakolikoilla ja joiden tähden hänen päästänsä julistettiin palkkio,
ennenkuin hän oli täyttänyt kahdeksattatoista ikävuottaan.

Ettei hän pelännyt eikä halunnut karttaa vastuunalaisuutta


teoistaan, sen hän kauheasti osoitti piirtämällä tikarinsa kärjellä
oman miekkansa kaatamien vastustajansa otsaan alkukirjaimensa
NT.

Seurueensa ja varojensa kasvaessa hän rakensi uudelleen synkän


Tornin linnan ja laajensi sitä sekä laittoi taaskin padon pieneen
puroon, joka menneinä aikoina oli tuonut vettä vallihautaan.

Kautta koko sen seudun, joka oli hänen toimintansa todistajana,


köyhät, halvat ja sorretut palvoivat hänen nimeäänkin. Kuninkaan
veronkantajilta anastamansa rahat hän jakoi takaisin piirin
viheliäisille talonpojille, ja kerran, kun Henrik kolmas lähetti pienen
retkikunnan häntä vastaan, hän piiritti ja vangitsi koko sotajoukon,
riisui miehiltä vaatteet, antoi ne köyhille ja saattoi heidät alastomina
ihan Lontoon portille.
Sitten tultuaan kaksikymmenvuotiaaksi oli Norman-paholainen,
joksi kuningas itse oli hänet ristinyt, maineeltaan tunnettu yli koko
Englannin, vaikka hänen kasvojaan ei ollut nähnyt yksikään henkiin
jäänyt ihminen hänen ystäviään ja seuralaistaan lukuunottamatta.
Hänestä oli tullut mahtitekijä, joka täytyi ottaa huomioon toiselta
puolen kuningas Henrikin ja hänen ulkomaalaisten suosikkiensa ja
toiselta puolen saksilaisten ja normannilaisten ylimysten välisessä
nopeasti kärjistyvässä riidassa.

Kumpikaan puoli ei tietänyt, mille suunnalle hänen voimansa


kääntyisi, sillä Norman of Torn oli ryöstänyt melkein tasapuolisesti
sekä kuninkaan kannattajilta että kapinallisilta. Omasta puolestaan
hän oli päättänyt olla liittymättä kumpaankaan puolueeseen, vaan
käyttää hyväkseen senaikaista hämminkiä saalistaakseen
puolueettomasti kumpaisiltakin.

*****

Kun Norman of Torn mukanaan viisi siivotonta, risaista hirtehistään


heidän ensimmäisen kohtauksensa päivänä lähestyi kolkkoa
linnakotiaan, seisoi Tornin vanhus toisessa pienessä porttitornissa
tarkkailemassa tätä vähälukuista seuruetta.

Pysähdyttyään tämän ulkoportin juurelle nuorukainen töräytti


kupeellaan riippuvaa torvea, jäljitellen sen ajan tapaa.

»Hoi! Kuka siellä?» luikkasi vanhus, tuimasti mukaantuen leikkiin.

»Sir Norman of Torn», vastasi Punapää-Shandy, »ja hänen komea


seurueensa jaloja ritareita, sotilaita, aseenkantajia, lakeijoja ja
kuormajuhtia. Avatkaa, sir Norman of Tornin vankan oikean käden
nimessä!»
»Mitä tämä merkitsee, poikani?» tiedusti vanhus, kun Norman of
Torn laskeutui satulasta pihalla.

Nuorukainen kertoi senaamuiset tapahtumat ja lausui lopuksi:


»Nämä siis ovat väkeäni, isä; ja yhdessä me samoilemme Englannin
valtateillä ja sivuteillä kootuksemme rikkailta englantilaisilta niitä
elatusvaroja, jotka, kuten sinä olet aina minulle opettanut, ovat
meille tulevat.»

»Se on oikein, poikani, ja juuri niin haluaisin itsekin sen jäljestää;


me lähdemme yhdessä ratsastamaan, ja missä ratsastamme, siellä
osoittavat verijäljet tietämme.

»Tästä alkaen paisuu Norman of Tornin nimen maine tässä


maassa, kunnes kuningaskin sen kuullessaan vapisee ja vihaa ja
kammoaa sinua, kuten olen sinuakin opettanut vihaamaan ja
kammoamaan häntä.

»Koko Englanti kiroaa sinua eikä saksilaisten ja normannien veri


koskaan pääse kuivamaan säilältäsi.»

Kun vanhus tämän purkauksen jälkeen poistui linnan pääporttia


kohti, virkkoi Shandy, kääntyen Norman of Tornin puoleen ja
virnistäen leveästi:

»Kautta paavin takajalan, teidän rakastettava isännepä pitää


englantilaisista! Suurenmoista pitäisi olla ratsastaa hänen kaltaisensa
miehen jäljessä.»

»Te ratsastatte minun jäljessäni, lurjus», karjaisi Norman of Torn,


»ja jotta et uudelleen niin pian unohtaisi, kuka on isäntäsi, ota tästä
muistuttaja!» Ja hän iski punatukkaista jättiläistä nyrkillään suoraan
vasten suuta, niin että mies raskaasti kellahti maahan.

Hän oli heti jälleen pystyssä, syljeksien verta ja uhkuen raivoa.


Kun hän härän tavoin syöksyi Norman of Tornia kohti, ei
viimemainittu liikahtanutkaan paljastaakseen miekkaansa; hän vain
seisoi käsivarret ristissä, silmäillen Shandya kylmän rauhallisesti, pää
pystyssä, ylpeillä kasvoillaan röyhkeän halveksumisen hymy.

Roteva roikale epäröi ja sitten seisahtui; hitaasti levisi hänen


piirteilleen säyseä hymy, hän laskeutui toiselle polvelleen, tarttui
Norman of Tornin käteen ja suuteli sitä, kuten mahtava ja uskollinen
ritari olisi suudellut kuninkaansa kättä rakkauden ja alamaisuuden
merkiksi. Tämä teko oli tavallaan raa'an, mutta ritarillisen
suurenmoinen; eikä se ainoastaan ollut merkkinä siitä, että Shandy
siitä lähtien oli koko elinaikansa hartaasti ja uskollisesti kiintynyt
nuoreen isäntäänsä, vaan myöskin ennusti, millaisen mielialan
Norman of Torn sittemmin herätti kaikissa niissä miehissä, jotka
häntä palvelivat tuhansien astuessa pitkien vuosien kuluessa sisälle
Tornin portista pyytääkseen itselleen paikkaa hänen uhkaavan
lippunsa alla.

Shandyn noustua polvistuivat John Flory, hänen veljensä James,


Silmäpuoli-Kanty ja Erakko-Peter toinen toisensa jälkeen nuoren
herransa eteen ja suutelivat hänen kättänsä. Isolta pihalta oli pieni,
tuikea, harmaapäinen vanhus katsellut tätä kohtausta hymyn häive
vanhoilla, pahanilkisillä kasvoillaan.

»Tämä ylittää hartaimmatkin unelmani», jupisi hän. »Kautta


Jumalan kuoleman, hän on kuninkaallisempi kuin itse Henrikki.
Jumala jouduttakoon hänen kruunauspäiväänsä, jolloin itsensä
Plantagenet-koiran silmien edessä hänen päähänsä kruunun sijasta
painetaan musta lakki ja hänen jalkojensa alla on valtaistuimen
asemesta puisen hirsipuun lava!»
SEITSEMÄS LUKU

Kauniina keväisenä päivänä toukokuussa vuonna 1262 ratsasti


Norman of Torn yksin kapeata polkua pitkin sille sievälle huvilalle,
jonka hän oli rakennuttanut vanhan ystävänsä isä Clauden majan
sijalle.

Tapansa mukaan hän ratsasti kypärinsilmikko suljettuna, eikä


hänen varuksissaan eikä hänen hevosensa hihnoissa ollut
minkäänlaisia arvon eikä syntyperän merkkejä. Hän oli mahtavampi
ja rikkaampi kuin monet hoviylimykset, mutta hänellä ei ollut
arvoasemaa eikä muuta arvonimeä kuin henkipaton nimitys, eikä
hän halunnut omaksua sellaista, mitä hän oikeastaan piti
vähäarvoisena.

Hän käytti rauta-asua, koska hänen vanha holhoojansa oli


kehoittanut häntä niin tekemään, eikä sen tähden, että hän kaipasi
sen tarjoamaa suojaa. Ja samasta syystä hän ratsastaessaan aina
piti kypärinsilmikkonsa suljettuna, vaikka hän ei mitenkään saanut
vanhusta selittämään, minkä tähden sellainen varovaisuus oli
tarpeen.
»Riittää, kun sanon sinulle, poikani», oli vanhuksen tapana
vakuuttaa, »että oman etusi samoin kuin minunkin etuni vuoksi sinä
et saa näyttää kasvojasi vihollisillesi, ennenkuin minä käsken. Pian
toivoakseni tulee se aika, jolloin saat paljastaa piirteesi koko
Englannille.»

Nuori mies ei ajatellut koko asiaa kovinkaan paljoa, tavallisesti


pitäen sitä vanhan, lapselliseksi muuttuneen ukon hupsuna
päähänpistona; mutta siitä huolimatta hän sitä noudatti.

Hänen sinä päivänä ratsastaessaan jyrkkää rinnettä alaspäin


kohosi hänen takanaan perin toisenlainen Torn kuin se oli ollut, jota
hän oli lähestynyt kuusitoista vuotta aikaisemmin, jolloin hän
pienenä poikasena oli ratsastanut illan pimenevässä hämyssä ison
hevosen selässä pienen vanhan eukon takana, joka heidän
saavuttuaan linnaan oli muuttunut pieneksi, tuimaksi,
harmaapäiseksi vanhaksi mieheksi.

Tänään tämä laaja, uhkaava rakennus kohosi isompana ja


vaikuttavampana kuin konsanaan entisen suuruutensa loistavimpina
päivinä. Jäljellä oli alkuperäinen runko suunnattomille, tukipatsailla
varustettuine, saksilaisine torneineen, joiden valtavia, neljän ja
puolen metrin paksuisia seiniä lävistivät portaikot ja holvatut
kammiot; valoa tuli ikkuna-aukoista, jotka muurin ulkopinnassa olivat
pelkkiä rakoja, mutta laajenivat sisäänpäin, niin että jotkut
muodostivat pienien, kolmikulmaisten huoneiden kokoisia komeroita.

Vallikaivantoa oli laajennettu ja syvennetty, ja se kaarsi linnaa


kolmelta puolelta sisemmän ja ulomman muurin välissä, joihin oli
sopivien välimatkojen päähän rakennettu pieniä, ulkonevia torneja,
sellaisilla ampuma-aukoilla varustettuja, että hyökkääjiä voitiin
sivultapäin ampua jousilla ja kaaripyssyillä sekä heitellä keihäillä.
Muurien ympäröimän alueen neljäs sivu oli korkean jyrkänteen
partaalla, ja tämä luonnollinen suoja teki tornit sillä puolella
tarpeettomiksi.

Linnan pääportti oli lännen puolella, ja sieltä lähti koukerteleva,


kivinen tie vuorien välitse laaksoon. Isolta portilta avautuva näköala
oli rauhallisen, jylhän kaunis. Etualalla olevan vähäisen ylängön
ylitse, jossa kasvoi vain niukalti yksinäisiä, pahkaisia tammia, saattoi
esteettömästi nähdä laajat, viehättävät niityt, joiden halki kiemurteli
Trentin kimalteleva syrjäjoki.

Vielä kaksi muuta porttia vei vankkaan linnoitukseen, toinen


pohjoisen, toinen itäisen muurin lävitse. Kaikilla kolmella portilla oli
lujat, torneilla ja tukipatsailla varustetut etuvarustukset, jotka täytyi
vallata, ennenkuin päästiin varsinaiselle portille. Kaikkien
etuvarustusten sisäänkäytävä oli varustettu suojaristikolla, ja kullakin
sisäportilla oli samanlainen turvalaite sekä lisäksi nostosilta, joka alas
laskettuna peitti kaivannon, mutta joka vihollisten lähestyessä voitiin
nostaa pystyyn tehokkaasti estämään heidän etenemisensä.

Uudet, Norman of Tornin ja hänen isäksi nimittämänsä tuiman


vanhuksen johdolla vanhaan runkoon lisätyt tornit ja rakennukset
olivat normannilaista tyyliä; ikkunat olivat laajemmat, kaiverrukset
huolellisemmin tehdyt, huoneet valoisammat ja tilavammat.

Muurien ympäröimälle laajalle alueelle oli syntynyt kohtalainen


kaupunki, sillä Tornin henkipatto, jolla oli tuhat soturia, tarvitsi paljon
aseenkantajia, lakeijoja, kokkeja, keittiöpoikia, aseseppiä,
hevosenkengittäjiä, tallirenkejä ja muita sellaisia huolehtimaan
hänen pienen armeijansa tarpeista.
Avaroissa talleissa oli tuhatviisisataa sotaratsua ja viisisataa
kuormajuhtaa, kun taas itäisellä pihalla vilisi lehmiä, härkiä, vuohia,
lampaita, sikoja, kaniineja ja kanoja.

Hitaiden, kuhnustelevien härkien vetämiä, isoja, puisia vankkureita


kävi joka päivä tässä uhkaavassa rakennusrykelmässä, tuoden
muonaa sekä ihmisille että eläimille ympäristön viljeltyjen seutujen
köyhiltä saksilaisilta talonpojilta, joille Norman of Torn maksoi
tuotteiden hinnan hyvässä kullassa.

Nämä raataja-poloiset olivat pahemmassa kuin orjan asemassa


ylpeiden ylimysten, heidän viljelemänsä maan omistajien, vallassa, ja
kuninkaallisella julistuksella heitä oli kielletty kuoleman uhalla
myymästä tai antamasta penninkään arvosta ruokatarpeita Tornin
henkipatolle, mutta siitä huolimatta hänen tukevat vankkurinsa
kävivät säännöllisesti ympäristöllä, aina palaten täyteen
kuormitettuina, ja vaikka talonpojat kertoivat surullisia tarinoita
herroilleen Tornin paholaisen kauheista ryöstöretkistä, joiden aikana
hän anasti heidän tavaroitaan väkisin, puhuivat he silloin
hampaittensa ulkopuolelta paholaisen kullan painaessa heidän
laskujaan.

Ja ylimysten alkaessa vihata häntä yhä enemmän, talonpoikien


rakkaus häntä kohtaan niin ollen yhä lujittui. Heitä hän ei milloinkaan
vahingoittanut; heidän aitauksensa, karjansa, viljansa, vaimonsa ja
tyttärensä saivat olla rauhassa, vaikkakin heidän herrojensa
naapurilinnat saatettiin ryöstää viinikellarista korkeimman tornin
lakivarustuksiin saakka. Eikä kukaan uskaltanut esiintyä
väkivaltaisesti sillä alueella, jolla Norman of Torn liikkui.
Kymmenkunta hirtehisjoukkiota hän oli kartoittanut Derbyn
kunnailta, ja vaikkakin ylimykset olisivat paljoa mieluummin pitäneet
kaikki muut kuin hänet, palvoivat talonpojat häntä, koska hän oli
vapauttanut heidät halpasyntyisistä murhamiehistä, joiden tapana oli
ollut ryöstää heikoilta ja alhaisilta ja joiden tähden majojen ja
mökkien naiset eivät olleet milloinkaan olleet turvassa.

Harvat heistä olivat nähneet hänen kasvonsa, ja vielä harvemmat


olivat puhelleet hänen kanssansa, mutta he rakastivat hänen
nimeään ja urhoollisuuttaan ja salaa rukoilivat hänen puolestaan
muinaista jumalaansa Wodinia sekä alempia metsän-, niityn- ja
metsästyksenjumalia, sillä vaikka he olivat nimellisesti kristittyjä,
sykähteli kuitenkin monen sydämessä heikkoja maininkeja esi-isien
ikivanhasta taikauskosta; ja vaikka he rukoilivat myöskin Herraa
Jeesusta ja Mariaa, tuntui heistä kuitenkin, ettei voisi olla vahingoksi
pysytellä hyvissä suhteissa muiden jumalien kanssa siltä varalta, että
ne sattuisivatkin olemaan olemassa.

He olivat köyhää, sorrettua, poljettua, tietämätöntä, taikauskoista


väkeä, miespolvien aikana tottuneita alistumaan milloin minkin
valtaajan ja väliajoilla läänitysherrojensa — jos sellaisia oli — ja
saaliinhimoisten itsevaltiaittensa tallattaviksi.

Ihmekö sitten, että sellaiset ihmiset jumaloivat Tornin henkipattoa,


sillä sen jälkeen, kun heidän rajut saksilaiset esivanhempansa olivat
hekin valloittajina tulleet Englantiin, ei kukaan muu ollut koskaan
nostanut kättänsä turvatakseen heitä sorrolta.

Tällaisesta alemman väestön, maaorjien ja vapautettujen,


kohtelusta eivät Norman of Torn ja hänen isäkseen nimittämänsä
vanhus olleet milloinkaan päässeet yksimielisiksi. Viimemainittu
tahtoi käydä vainosotaansa kaikkia englantilaisia vastaan, mutta
nuori mies ei halunnut kuullakaan sellaisesta eikä sallinut
kenenkään, joka lähti Tornista ratsastamaan, ahdistaa rahvasta.
Risainen takki oli tätä hurjaa laumaa vastaan varmempi suoja kuin
vankka keihäs ja vaakunalla koristettu kilpi.

Kun Norman of Torn ratsasti valtavasta linnastaan vierailulle isä


Clauden luokse auringon säteiden leikkiessä hänen kalahtelevilla
varuksillaan ja heijastuessa hänen kilpensä kuparinupista, ei niin
ollen ollut kovinkaan merkillistä nähdä pientä metsästäjäryhmää
paljastetuin päin tiepuolessa polvillaan hänen mennessään ohitse.

Astuttuaan papin työhuoneeseen Norman of Torn riisui


aseistuksensa ja laskeutui alakuloisena penkille, nojaten selkänsä
seinään ja ojentaen voimakkaat, joustavat jalkansa eteenpäin.

»Mikä sinua vaivaa, poikaseni», tiedusti pappi, »kun näytät noin


lohduttomalta näin kauniina päivänä?»

»En tiedä, isä», vastasi Norman of Torn, »jollei syynä ole se, että
kysyn itseltäni: 'Mitä varten kaikki tämä?' Minkä tähden isäni opetti
minut aina ryöstämään lähimmäisiltäni? Pidän taistelusta, mutta
taistella saa yllin kyllin laillisestikin, ja mitä hyötyä minulla on kaikista
ryöstetyistä varoistani, jollen saa mennä ihmisten asumasijoille niitä
kuluttamaan? Jos pistäisin pääni Lontoon kaupunkiin, jäisi se
epäilemättä sinne hamppuisen kaulanauhan pidättämällä.

»Mitäpä kaunaa minulla on kuninkaalle tai aatelisille? Heillä tosin


on kylliksi syytä vihata minua, mutta siitä huolimatta en käsitä,
minkä tähden minun piti vihata heitä niin kiihkeästi, ennenkuin olin
kyllin vanha tietämään, kuinka kunnottomia he todella ovat.
Senvuoksi minusta tuntuu, että olen vain vanhuksen häijyyden
välikappale tietämättä edes, minkä loukkauksen kostamiseen toinen
ihminen on pyhittänyt elämäni.
»Ja vanhemmaksi tultuani, isä Claude, olen joskus suuresti
epäillyt, onko Tornin nimetön vanhus lainkaan isäni, niin vähän minä
muistutan häntä, enkä koko elämäni aikana ole kuullut ainoatakaan
isällisen hellää sanaa enkä tuntenut hyväilyä, en edes pikku lapsena.
Mitä siitä arvelet, isä Claude?»

»Olen miettinyt sitä paljon, poikaseni», vastasi pappi. »Se on aina


ollut vaivaavana pulmana mielessäni, ja minulla on omat epäluuloni,
joita olen hautonut vuosikausia, mutta joiden ajatteleminenkin
peloittaa minua niin, että minua puistattaa kuvitellessani, mitä
seurauksia niiden lausumisesta koituisi. Norman of Torn, jollet ole
isäksi nimittämäsi vanhuksen poika, varjelkoon Jumala Englantia
milloinkaan aavistamasta, ketkä oikeat vanhempasi ovat! Enempää
en rohkene sanoa muuta kuin sen, että jos pidät arvossa
mielenrauhaasi ja henkeäsi, pidä kypärinsilmikkosi suljettuna äläkä
antaudu vihollistesi kynsiin.»

»Tiedätkö siis, minkä tähden minun tulee pitää kypärinsilmikkoni


suljettuna?»

»Voin vain arvata, Norman of Torn, koska olen nähnyt erään toisen
henkilön, jota sinä muistutat.»

Keskustelun keskeytti ulkoa kuuluva häly, hevosten kavioiden


kapse, miesten huudot ja aseiden kalske. Heti kiiruhtivat molemmat
miehet pienelle, lasittomalle ikkunalle. Heidän kohdallaan maantiellä
taisteli nyt viisi panssariasuista ritaria kymmentä tai kahtatoista
teräspukuista soturia vastaan, ja hieman syrjässä kamppailijoista
istui nuori nainen henkeään pidätellen ratsunsa selässä.

Pian eräs ritareista erkani taistelun tehneestä, ratsasti hänen


luoksensa ja lausui joitakuita käskeviä sanoja, samalla karkeasti
tarttuen hänen ratsunsa suitsiin. Tyttö kohotti ratsuraippaansa ja
sivalsi useita kertoja, mutta turhaan ahdistajansa rautaista
päähinettä, samalla kun viimemainittu pyöräytti hevosensa ympäri ja
lasketti nopeata neliä pois näkyvistä, kiskoen tytön ratsua jäljessään.

Norman of Torn juoksi ovelle ja siitä huolimatta, ettei hänen


yllänsä ollut rauta-asua, ponnahti sir Mortimerin selkään ja lähti
vinhaa vauhtia siihen suuntaan, johon tyttö ja hänen ryöstäjänsä
olivat menneet.

Kookas musta oli nopea, ja kun sitä ei nyt painanut ratsastajansa


tavallinen, raskas asu, sai se pian pakenijat näkyviin. Tuskin
puoltatoista kilometriä oli ratsastettu, ennenkuin ritari kääntyessään
taaksepäin vilkaisemaan, ajettiinko häntä takaa, näki Norman of
Tornin kasvot vajaan kymmenen askeleen päässä itsestään.

Kasvoillaan sekava hämmästyksen, harmin ja epäilyksen ilme ritari


seisautti ratsunsa, samalla huudahtaen: »Mon Dieu, Edward!»

»Paljasta miekkasi ja puolustaudu!» kiljaisi Norman of Torn.

»Mutta, teidän korkeutenne», änkytti ritari.

»Puolustaudu! Muutoin pistän sinut kuoliaaksi samoin kuin olen


tappanut satoja englantilaissikoja», karjui Norman of Torn.

Nelistävä ori oli melkein saavuttanut ritarin, ja hän odotti


ratsastajan pysäyttävän sen, mutta mustan vasaman tavoin sir
Mortimer tömähti suoraan toisen hevosen lapaan, ja sekä mies että
ratsu kierähtivät maantien tomuun.

Ritari nousi pystyyn vahingoittumattomana, ja Norman of Torn


hypähti maahan aloittaakseen rehellisen, tasapuolisen ottelun.
Vaikka ritaria haittasi varuksien paino, oli hänelle myöskin niiden
suojan suoma etu, joten he kamppailivat vimmatusti useita
minuutteja kummankaan pääsemättä voitolle.

Tyttö istui liikkumattomana ja silmät levällään maantien ohessa,


tarkkaillen ottelijain jokaista liikettä. Hän ei yrittänytkään pakoon;
hänen edessään riehuvan taistelun rajuus ja mahdollisesti hänen
avukseen rientäneen jättiläisen kiehtova ulkomuoto pitivät häntä
ikäänkuin paikalleen naulattuna. Katsellessaan puolustajaansa hän
näki joustavan, lihaksikkaan, ruskeatukkaisen nuorukaisen, jonka
kirkkaista silmistä ja moitteettomasta vartalosta, koska niitä ei
piilottanut kypäri eikä rautapaita, kuvastui harjaantuneen taistelijan
puhdas urheiluelämä.

Hänen kasvoillaan väikkyi kopean ylpeyden vähäinen kylmä hymy,


kun hänen oikea kätensä jokaisella liikkeellään paljasti valtavan
voimansa ja taitonsa leikkiessään hiestyneellä, huohottavalla rauta-
asuisella vastustajalla, joka saumattomasti huitoi ja hosui
miekallaan. Kalahtelevien säilien ja varuksien kovasta melusta
huolimatta ei kumpikaan ottelija ollut saanut paljoakaan
vahingoitetuksi toista, sillä ritari ei pystynyt voimalla eikä taidolla
survaisemaan miekkansa kärkeä varuksettoman vastustajansa
erehtymättömästi väistävän säilän ohitse, kun taas viimemainitun oli
vaikea pistää toisen rautaisen asun lävitse.

Vihdoin Norman of Torn valtavalla voimallaan työnsi säilänsä


kärjen vastustajan rautapaidan renkaiden lävitse, ja tuskasta
parahtaen mies vaipui hervottomana maahan.

»Nopeasti, herra ritari!» huudahti tyttö. »Nouskaa ratsaille ja


paetkaa! Tuolla tulevat hänen kumppaninsa.»
Ja kun Norman of Torn kääntyi siihen suuntaan, josta hän oli
äsken tullut, kiiruhti sieltä tosiaankin häntä kohti täyttä laukkaa
kolme teräsasuista miestä valtavien ratsujen selässä.

»Ratsastakaa, madame!» kehoitti Norman of Torn. »Minä en


pakene enkä ilman varuksia ja jalkaisin voi toivoa kykeneväni
viivyttämään noita kolmea miestä muuta kuin hetkisen, mutta sillä
aikaa pitäisi teidän helposti päästä pakoon, sillä heidän
raskastaakkaiset hevosensa eivät mitenkään jaksa saavuttaa nopeata
ratsuanne.»

Vasta puhuessaan hän tarkasti nuorta naista. Että hän oli ylhäinen
nainen, sitä eivät osoittaneet ainoastaan hänen ratsastusasunsa ja
hevosensa hihnoituksen upeus, vaan myöskin hänen ylimyksellinen
ja kopea esiintymisensä ja kauniiden kasvojensa ylpeä ilme.

Vaikka Norman of Tornin pää oli tähän aikaan nähnyt melkein


kahdenkymmenen vuoden menevän ohitseen, ei hänellä ollut tietoja
eikä kokemuksia naisten tavoista, eikä hän ollut kertaakaan puhellut
ainoankaan aatelisen eikä arvoasemassa olevan naisen kanssa.
Tornin linnaa ei kaunistanut ainoakaan nainen, eikä poika, mikäli
muisti, ollut koskaan nähnyt äitiään.

Hän käyttäytyi sen vuoksi naisia kohtaan hyvin samaan tapaan


kuin miehiäkin kohtaan lukuunottamatta sitä, että hän oli vannonut
aina suojelevansa heitä. Kenties hän tavallaan kunnioitti naisia, jos
Norman of Tornin voitiin sanoa kunnioittavan mitään, Jumalaa,
ihmisiä tai paholaista. Hänen tapansa oli pikemminkin halveksia
kaikkia olentoja, jotka hän lainkaan vaivautui panemaan merkille.

Katseensa ollessa kiintynyt tähän nuoreen naiseen, jonka kohtalo


oli määrännyt muuttamaan koko hänen elämänsä juoksun, Norman
of Torn näki, että hän oli kaunis ja kuului siihen luokkaan, jota hän
oli vuosikausia saalistanut lainsuojattomille hirtehisjoukkueineen.
Sitten hän taaskin kääntyi uhmailemaan tytön vihollisia, osoittaen
sitä kummallista epäjohdonmukaisuutta, joka oli aina ollut hänen
menettelytapojensa omituinen piirre.

Seuraavana päivänä hän saattaisi hyökätä neidon isän linnan


varustuksille, mutta nyt hän oli ilomielin valmis uhraamaan henkensä
hänen puolestaan — jos tyttö olisi ollut hiilenpolttajan tytär, olisi
nuorukainen tehnyt samoin — se riitti, että hän oli nainen ja
suojeluksen tarpeessa.

Ritarit olivat nyt melkein hänen kimpussaan ja komeasti


välittämättä rehellisen taistelun vaatimuksista syöksyivät keihäät
tanassa varustuksetonta jalkamiestä kohti. Mutta kun ensimmäinen
ritari ehti kyllin likelle erottaakseen hänen kasvonsa, huudahti hän
ällistyneenä ja tyrmistyneenä:

»Mon Dieu, le Prince!» Samalla hän pyöräytti nelistävän ratsunsa


syrjään. Kuultuaan hänen huudahduksensa noudattivat hänen
kumppaninsa esimerkkiä, ja kaikki kolme kiitivät edelleen maantietä
pitkin, ilmeisesti nyt yhtä kiihkeästi pyrkien pakoon kuin äsken
hyökkäämään.

»Saattaisi luulla heidän kohdanneen paholaisen», mutisi Norman


of Torn, silmäillen heidän jälkeensä teeskentelemättömän
hämmästyneenä.

»Mitä tämä merkitsee, lady?» kysyi hän, kääntyen neidon puoleen,


joka ei ollut liikahtanutkaan paetakseen.
»Se merkitsee, että kasvonne hyvin tunnetaan isänne
valtakunnassa, teidän korkeutenne», vastasi tyttö. »Eikä kuninkaan
puoluelaisilla ole vähääkään halua taistella teitä vastaan, vaikka he
eivät käsittäne sen paremmin kuin minäkään, minkä tähden te
haluatte puolustaa Simon de Montfortin tytärtä.»

»Pidetäänkö minua siis Englannin prinssinä Edwardina?»


kummasteli nuorukainen.

»Kenä muuna pitäisi teitä sitten pitää, mylord?»

»Minä en ole prinssi», sanoi Norman of Torn. »Edwardin kerrotaan


olevan
Ranskassa.»

»Olette oikeassa, sir», huudahti tyttö. »Mutta olette niin hänen


näköisensä, että hyvin voisitte harhauttaa itse kuningattarenkin. Ja
te olette kyllin uljas sopiaksenne kuninkaanpojaksi. Kuka te sitten
olette, herra ritari, joka olette paljastanut säilänne ja uhmaillut
kuolemaa Bertraden, Simon de Montfortin, Leicesterin kreivin,
tyttären puolesta?»

»Oletteko te de Montfortin, kuningas Henrikin langon tytär?»


tiedusti Norman of Torn silmiensä souketessa kapeiksi raoiksi ja
kasvojensa kovettuessa.

»Olen kyllä», vastasi tyttö. »Ja kasvoistanne päätän, että te ette


kovinkaan paljon rakasta de Montfortia», lisäsi hän hymyillen.

»Entä minne olette matkalla, lady Bertrade de Montfort? Vaikkapa


olisitte paholaisen tytär tai sisarentytär, olette kuitenkin nainen, enkä
minä sodi naisia vastaan. Minne hyvänsä haluatte, sinne saatan
teidät turvaan.»

»Olin äsken isäni viiden palvelijan saattamana Maryn, Derbyn


herran
John de Stutevillen tyttären, luokse.»

»Tiedän hyvin sen linnan», virkkoi Norman of Torn, ja tuiman


hymyn häive väreili hänen huulillaan, sillä tuskin kahta kuukautta oli
kulunut siitä, kun hän oli vallannut tämän linnoituksen ja ottanut
pakkoveroa mahtavalta ylimykseltä. »Tulkaa, teillä ei ole enää pitkä
matka, ja jos kiiruhdamme, ehditte syömään ystävättärenne kanssa
illallista ennen pimeän tuloa.»

Niin sanottuaan hän nousi ratsaille ja kääntyi palatakseen


maantielle, mutta samassa hän huomasi vainajan, joka virui siinä,
mihin oli kaatunut.

»Ratsastakaa te edelleen!» kehoitti hän Bertrade de Montfortia.


»Tulen perässänne heti.»

Laskeuduttuaan jälleen satulasta hän meni äskeisen vastustajansa


luokse, aukaisi kuolleelleen ritarin kypärinsilmikon ja piirsi vainajan
otsaan tikarinsa kärjellä kirjaimet NT.

Tyttö kääntyi katsomaan, mikä häntä viivytti, mutta hänen


selkänsä oli sinnepäin hänen ollessaan polvillaan kaatuneen
vastustajansa vieressä, eikä neito nähnyt hänen tekoaan. Vaikka hän
olikin uljaan isän uljas tytär, olisi hänen sydämensä sykertynyt
kokoon, jos hän olisi nähnyt, mitä mies teki, ja hän olisi kauhuissaan
paennut tämän Englantia vaivaavan vitsauksen luota, jonka merkin
hän oli nähnyt isänsä kymmenkunnan kuolleen palvelijan ja
sukulaisen otsassa.

Heidän tiensä Stutevilliin vei isä Clauden asunnon ohitse, ja


Norman of Torn pysähtyi siellä pukeutumassa sota-asuunsa. Nyt hän
taaskin ratsasti kypärinsilmikko suljettuna ja äänettömänä, hieman
jäljempänä Bertrade de Montfortia voidakseen tarkastella neidon
kasvoja, jotka äkkiä olivat alkaneet herättää hänen mielenkiintoaan.

Koskaan ennen hän ei ollut muistiaikanaan ollut niin likellä nuorta


ja kaunista naista niin kauan yhtä mittaa, vaikka hän oli usein nähnyt
naisia linnoissa, jotka hän oli vallannut rajuilla ja hirveillä
hyökkäyksillään. Joskin kerrottiin tarinoita siitä, kuinka halpamaisesti
hän kohteli naisvankejaan, ei niissä ollut ensinkään perää. Niitä vain
levittelivät hänen vihamiehensä kiihoittaakseen kansaa häntä
vastaan. Milloinkaan ei Norman of Torn ollut tehnyt väkivaltaa
naiselle, ja hänen hirtehisjoukkonsa oli vannonut kunnioittavansa ja
suojelevansa heikompaa sukupuolta kuolemanrangaistuksen uhalla.

Kun hän syrjäviistosta katseli edessään olevia viehkeitä kasvoja,


liikahti hänen sydämessään tunne, joka oli pyrkinyt purkautumaan jo
vuosikausia. Se ei ollut rakkautta eikä rakkauden tapaistakaan
tunnetta, vaan syvää niiden henkilöiden kaipausta, joihin tyttö kuului
ja joita hän edusti. Norman of Torn ei olisi osannut tulkita tätä
tunnetta sanoilla, sillä hän ei tiennyt, niitä se oli; mutta se oli
etäinen, heikko samanlaista verta ikävöivän veren huuto, ja siihen oli
sekoittunut shakaalien parissa olevan leijonan muihin leijoniin ja
kenties myöskin omaan naarasleijonaansa kohdistuvaa kaipausta.

Heidän ratsastettuaan useita kilometrejä äänettöminä neito äkkiä


kääntyi häneen päin ja lausui:
»Kylläpä te, herra ritari, tarvitsette aikaa, vastataksenne
kysymykseeni. Kuka olette?»

»Olen Nor—» Mutta sitten hän katkaisi sanansa. Aikaisemmin hän


oli aina vastannut siihen kysymykseen uhkamielisen ylpeästi. Miksi
piti hänen epäröidä, mietti hän. Pelkäsikö hän sitä kammoa, jota se
nimi herättäisi tämän hänen halveksimansa ylimystön tyttären
rinnassa? Peloittiko Norman of Tornia katsella halveksimisen ja inhon
ilmettä, jonka hän varmasti arvasi kuvastuvan noissa viehättävissä
kasvoissa?

»Olen Normandiasta», jatkoi hän tyynesti. »Ranskalainen


herrasmies.»

»Entä nimenne?» tiukkasi tyttö käskevästi. »Häpeättekö


nimeänne?»

»Teidän sopii nimittää minua Rogeriksi», vastasi Norman, »Roger


de
Condéksi».

»Avatkaa kypärinsilmikkonne, Roger de Condé!» komensi neito.


»Minusta ei ole hupaista ratsastaa rauta-asun seurassa; haluaisin
nähdä, että sen sisällä on mies.»

Norman of Torn hymyili noudattaessaan käskyä, ja kun hän


hymyili siten, mikä tapahtui harvoin, oli hän hauskan näköinen.

»Se on ensimmäinen komennus, jota olen totellut sen jälkeen, kun


täytin kuusitoista vuotta, Bertrade de Montfort», virkkoi hän.

Tyttö oli yhdeksäntoistavuotias, uhkui nuoruuden ja terveyden


reippaatta ja hilpeyttä, ja niinpä he samosivat, puhellen ja
naureskellen, ikäänkuin olisivat olleet vanhoja ystävyksiä.

Neito kertoi, minkä tähden hänen kimppuunsa oli aikaisemmin sinä


päivänä hyökätty, pitäen sitä erään ylimyksen, Peter of Colfaxin,
yrityksenä ryöstää hänet, koska hänen isänsä oli jyrkästi ja tylysti
hylännyt miehen kosinnan.

Simon de Montfortin tapana ei ollut seuloa sanojaan, ja


epäilemättä hänen tyttärensä kättä pyytänyt vanha vintiö oli kuullut
joitakuita kirpeitä totuuksia tältä mieheltä, joka oli kahdesti
loukannut Englannin ylimystöä karkeilla ja sievistelemättömillä,
vaikka todenmukaisilla ja vilpittömillä, kuninkaalle osoitetuilla
puheillaan.

»Tästä Peter of Colfaxista pidetään huoli», murahti Norman of


Torn. »Ja koska olette hylännyt hänen sydämensä ja kätensä, saatte
hänen päänsä, jos sitä pyydätte. Teidän tarvitsee vain käskeä,
Bertrade de Montfort.»

»Sepä hyvä», kiitti tyttö naurusuin, arvellen sitä vain


joutavanpäiseksi kerskumiseksi, jota niihin aikoihin ahkerasti
harrastettiin. »Teidän sopii tuoda minulle hänen päänsä kultaisella
vadilla, Roger de Condé.»

»Entä millaisen palkkion se ritari ansaitsee, joka tuo valtiattarensa


jalkojen juureen hänen vihamiehensä pään?»

»Mitä suosionosoitusta ritari vaalii?»

»Sitä, että kuinka paljon pahaa teille ritaristanne kerrottaneenkaan


ja millaisia parjauksia hänen niskaansa syydettäneenkään, olette
aina hänen ystävänsä ja luotatte hänen kunniantuntoonsa ja
vilpittömään uskollisuuteensa.»

Tyttö nauroi iloisesti vastatessaan, vaikka jokin tuntui ilmaisevan


hänelle, että tämä oli enemmän kuin leikkiä.

»Olkoon niinkuin sanoitte, herra ritari!» lupasi hän. »Ja kerran


annettu lupaus pidetään aina.»

Nopeana tekemään päätöksensä ja yhtä nopeana toimimaan


Norman of Torn päätteli pitävänsä tästä tytöstä ja toivovansa hänen
ystävyyttään enemmän kuin mitään muuta, mistä hän tiesi mitään.
Ja koska hän sitä toivoi, päätti hän voittaa sen kaikilla keinoilla, jotka
olivat sopusoinnussa hänen kunniankäsitteittensä kanssa; ja hänen
kunniankäsitteensä olivat monissa suhteissa ylevämmät kuin
senaikaisen aateliston.

He saapuivat de Stutevillin linnaan myöhään iltapäivällä. Siellä


lausuttiin Norman of Torn herttaisesti tervetulleeksi, ja häntä
vaadittiin noudattamaan paroonin vieraanvaraista kehoitusta ja
jäämään yöksi.

Tilanteen karmea huumori oli henkipatosta liian houkutteleva, ja


kun se tuli lisäksi hänen uuteen toivomukseensa saada olla Bertrade
de Montfortin seurassa, ei hän yrittänytkään vastustaa, vaan ehätti
hyväksymään ystävällisen tarjouksen.

Pitkän pöydän ääressä, jolle illallinen oli katettu, istuivat kaikki


paroonin talouden jäsenet, ja siellä täällä oli miehillä merkkejä
haavoista, jotka olivat parhaiksi ehtineet parantua, kun taas isäntä
itse vieläkin kantoi oikeata kättänsä siteessä.
»Kestettävänämme on ollut karvaita aikoja», selitti sir John
huomattuaan vieraansa silmäilevän kahakan monia merkkejä. »Se
lemmonsikiö, Norman paholainen, piiritti saastaisine laumoineen
meitä kymmenen päivää ja valtasi sitten linnan rynnäköllä sekä
ryösti sen. Elämä ei enää ole turvallista Englannissa, kun kuningas
tuhlaa aikansa ja rahansa ulkomaalaisten suosikkien seurassa ja
pestaa ulkomaista sotaväkeä taistelemaan oman maan ylimyksiä
vastaan eikä turvaa kodin rauhaa ja suojaa, joka on jokaisen
englantilaisen oikeus.

»Mutta», jatkoi hän, »tämä henkipattoinen pahus joutuu


hirttonuoran jatkoksi, kun sisällinen riitamme loppuu, sillä ylimykset
ovat itse päättäneet lähteä sotaretkelle häntä vastaan, jollei
kuningas halua häntä masentaa».

»Ja hän saattaa lähettää ylimykset alastomina kotiin, kuten hän


lähetti kuninkaan sotilaat», tokaisi Bertrade de Montfort nauraen.
»Haluaisin nähdä sen miehen; miltä hän näyttänee — teidän omasta,
sir John, ja monien sotilaitten ne ulkonäöstä päättäen lienee täällä
useitakin sellaisia, jotka ovat hänet kohdanneet.»

»Hän ei kertaakaan avannut kypärinsilmikkoaan ollessaan meidän


keskellämme», vastasi parooni, »mutta jotkut väittävät nähneensä
hänestä lyhyen vilahduksen ja vakuuttavat, että hänellä on
kammottavat kasvot, tuuhea, keltainen parta, toinen silmä poissa ja
iso, punainen arpi otsasta leukaan saakka».

»Hirveä näky», jupisi Norman of Torn. »Eipä ihmekään, että hän


pitää kypärinsilmikkonsa suljettuna.»

»Mutta millainen miekankäyttelijä!» sekaantui puheeseen muuan


de Stutevillin pojista. »Ei ikinä ole koko maailmassa nähty sellaista

You might also like