1.Primitive Data 1
1.1.Changing the Capitalization of a String 3
1.2.Cleaning Up Whitespace in a String 4
1.3.Building a String from Parts 5
1.4.Treating a String as a Sequence of Characters 7
1.5.Converting Between Characters and Integers 8
1.6.Formatting Strings 10
1.7.Searching a String by Pattern 12
1.8.Pulling Values Out of a String Using Regular Expressions 13
1.9.Performing Find and Replace on Strings 15
1.10.Splitting a String into Parts 17
1.11.Pluralizing Strings Based on a Quantity 18
1.12.Converting Between Strings,Symbols,and Keywords 20
1.13.Maintaining Accuracy with Extremely Large/Small Numbers 22
1.14.Working with Rational Numbers 24
1.15.Parsing Numbers 25
1.16.Truncating and Rounding Numbers 26
1.17.Performing Fuzzy Comparison 28
1.18.Performing Trigonometry 30
1.19.Inputting and Outputting Integers with Different Bases 31
1.20.Calculating Statistics on Collections of Numbers 33
1.21.Performing Bitwise Operations 36
1.22.Generating Random Numbers 38
1.23.Working with Currency 39
1.24.Generating Unique IDs 41
1.25.Obtaining the Current Date and Time 43
1.26.Representing Dates as Literals 44
1.27.Parsing Dates and Times Using clj-time 46
1.28.Formatting Dates Using clj-time 48
1.29.Comparing Dates 49
1.30.Calculating the Length of a Time Interval 51
1.31.Generating Ranges of Dates and Times 52
1.32.Generating Ranges of Dates and Times Using Native Java Types 54
1.33.Retrieving Dates Relative to One Another 57
1.34.Working with Time Zones 59
1.35.Converting a Unix Timestamp to a Date 60
1.36.Converting a Date to a Unix Timestamp 62
2.Composite Data 65
2.1.Creating a List 67
2.2.Creating a List from an Existing Data Structure 68
2.3."dding"an Item to a List 70
2.4."Removing"an Item from a List 71
2.5.Testing for a List 72
2.6.Creating a Vector 73
2.7."Adding"an Item to a Vector 74
2.8."Removing"an Item from a Vector 75
2.9.Getting the Value at an Index 76
2.10.Setting the Value at an Index 78
2.11.Creating a Set 79
2.12.Adding and Removing Items from Sets 81
2.13.Testing Set Membership 82
2.14.Using Set Operations 84
2.15.Creating a Map 86
2.16.Retrieving Values from a Map 88
2.17.Retrieving Multiple Keys from a Map Simultaneously 91
2.18.Setting Keys in a Map 92
2.19.Using Composite Values as Map Keys 96
2.20.Treating Maps as Sequences(and Vice Versa) 98
2.21.Applying Functions to Maps 100
2.22.Keeping Multiple Values for a Key 102
2.23.Combining Maps 105
2.24.Comparing and Sorting Values 107
2.25.Removing Duplicate Elements from a Collection 111
2.26.Determining if a Collection Holds One of Several Values 113
2.27.Implementing Custom Data Structures:Red-Black Trees—Part Ⅰ 114
2.28.Implementing Custom Data Structures:Red-Black Trees—Part Ⅱ 117
3.General Computing 123
3.1.Running a Minimal Clojure REPL 123
3.2.Interactive Documentation 125
3.3.Exploring Namespaces 127
3.4.Trying a Library Without Explicit Dependencies 128
3.5.Running Clojure Programs 129
3.6.Running Programs from the Command Line 132
3.7.Parsing Command-Line Arguments 134
3.8.Creating Custom Project Templates 137
3.9.Building Functions with Polymorphic Behavior 141
3.10.Extending a Built-In Type 147
3.11.Decoupling Consumers and Producers with core.async 148
3.12.Making a Parser for Clojure Expressions Using core.match 152
3.13.Querying Hierarchical Graphs with core.logic 155
3.14.Playing a Nursery Rhyme 161
4.Local I/O 167
4.1.Writing to STDOUT and STDERR 167
4.2.Reading a Single Keystroke from the Console 169
4.3.Executing System Commands 170
4.4.Accessing Resource Files 173
4.5.Copying Files 175
4.6.Deleting Files or Directories 177
4.7.Listing Files in a Directory 178
4.8.Memory Mapping a File 180
4.9.Reading and Writing Text Files 181
4.10.Using Temporary Files 183
4.11.Reading and Writing Files at Arbitrary Positions 184
4.12.Parallelizing File Processing 185
4.13.Parallelizing File Processing with Reducers 187
4.14.Reading and Writing Clojure Data 190
4.15.Using edn for Configuration Files 192
4.16.Emitting Records as edn Values 196
4.17.Handling Unknown Tagged Literals When Reading Clojure Data 198
4.18.Reading Properties from a File 201
4.19.Reading and Writing Binary Files 203
4.20.Reading and Writing CSV Data 205
4.21.Reading and Writing Compressed Files 206
4.22.Working with XML Data 208
4.23.Reading and Writing JSON Data 209
4.24.Generating PDF Files 211
4.25.Making a GUI Window with Scrollable Text 215
5.Network I/O and Web Services 221
5.1.Making HTTP Requests 221
5.2.Performing Asynchronous HTTP Requests 223
5.3.Sending a Ping Request 225
5.4.Retrieving and Parsing RSS Data 226
5.5.Sending Email 228
5.6.Communicating over Queues Using RabbitMQ 231
5.7.Communicating with Embedded Devices via MQTT 238
5.8.Using ZeroMQ Concurrently 242
5.9.Creating a TCP Client 245
5.10.Creating a TCP Server 247
5.11.Sending and Receiving UDP Packets 250
6.Databases 255
6.1.Connecting to an SQL Database 256
6.2.Connecting to an SQL Database with a Connection Pool 259
6.3.Manipulating an SQL Database 262
6.4.Simplifying SQL with Korma 268
6.5.Performing Full-Text Search with Lucene 272
6.6.Indexing Data with ElasticSearch 274
6.7.Working with Cassandra 279
6.8.Working with MongoDB 282
6.9.Working with Redis 286
6.10.Connecting to a Datomic Database 289
6.11.Defining a Schema for a Datomic Database 291
6.12.Writing Data to Datomic 295
6.13.Removing Data from a Datomic Database 298
6.14.Trying Datomic Transactions Without Committing Them 300
6.15.Traversing Datomic Indexes 302
7.Web Applications 307
7.1.Introduction to Ring 307
7.2.Using Ring Middleware 309
7.3.Serving Static Files with Ring 311
7.4.Handling Form Data with Ring 313
7.5.Handling Cookies with Ring 314
7.6.Storing Sessions with Ring 316
7.7.Reading and Writing Request and Response Headers in Ring 318
7.8.Routing Requests with Compojure 320
7.9.Performing HTTP Redirects with Ring 322
7.10.Building a RESTful Application with Liberator 323
7.11.Templating HTML with Enlive 325
7.12.Templating with Selmer 332
7.13.Templating with Hiccup 336
7.14.Rendering Markdown Documents 339
7.15.Building Applications with Luminus 342
8.Performance and Production 345
8.1.AOT Compilation 345
8.2.Packaging a Project into a JAR File 347
8.3.Creating a WAR File 350
8.4.Running an Application as a Daemon 354
8.5.Alleviating Performance Problems with Type Hinting 360
8.6.Fast Math with Primitive Java Arrays 363
8.7.Simple Profiling with Timbre 366
8.8.Logging with Timbre 367
8.9.Releasing a Library to Clojars 369
8.10.Using Macros to Simplify API Deprecations 371
9.Distributed Computation 377
9.1.Building an Activity Feed System with Storm 378
9.2.Processing Data with an Extract Transform Load(ETL)Pipeline 387
9.3.Aggregating Large Files 391
9.4.Testing Cascalog Workflows 396
9.5.Checkpointing Cascalog Jobs 398
9.6.Explaining a Cascalog Query 400
9.7.Running a Cascalog Job on Elastic MapReduce 403
10.Testing 405
10.1.Unit Testing 406
10.2.Testing with Midje 410
10.3.Thoroughly Testing by Randomizing Inputs 413
10.4.Finding Values That Cause Failure 417
10.5.Running Browser-Based Tests 420
10.6.Tracing Code Execution 426
10.7.Avoiding Null-Pointer Exceptions with core.typed 429
10.8.Verifying Java Interop Using core.typed 431
10.9.Type Checking Higher-Order Functions with core.typed 435
Index 439