{"product_id":"professional-clojure-9781119267270","title":"Professional Clojure","description":"\u003cb\u003eBook Synopsis\u003c\/b\u003e\u003cbr\u003eClear, practical Clojure for the professional programmer   Professional Clojure is the experienced developer's guide to functional programming using the Clojure language.\u003cbr\u003e\u003cbr\u003e\u003cb\u003eTrade Review\u003c\/b\u003e\u003cbr\u003e\"A book that makes you think, from the first chapter's dive into thoughtful code-led examples, and covers web services, testing and performance. Brings you closer to functional thinking.\" (MagPi, October 2016)\u003cbr\u003e\u003cbr\u003e\u003cb\u003eTable of Contents\u003c\/b\u003e\u003cbr\u003e\u003cp\u003eINTRODUCTION xv\u003c\/p\u003e \u003cp\u003e\u003cb\u003eCHAPTER 1: HAVE A BEGINNER’S MIND 1\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eFunctional Thinking 2\u003c\/p\u003e \u003cp\u003eValue Oriented 2\u003c\/p\u003e \u003cp\u003eThinking Recursively 5\u003c\/p\u003e \u003cp\u003eHigher Order Functions 8\u003c\/p\u003e \u003cp\u003eEmbracing Laziness 11\u003c\/p\u003e \u003cp\u003eWhen You Really Do Need to Mutate 12\u003c\/p\u003e \u003cp\u003eNil Punning 15\u003c\/p\u003e \u003cp\u003eThe Functional Web 16\u003c\/p\u003e \u003cp\u003eDoing Object-Oriented Better 16\u003c\/p\u003e \u003cp\u003ePolymorphic Dispatch with defmulti 18\u003c\/p\u003e \u003cp\u003eDefining Types with deftype and defrecord 20\u003c\/p\u003e \u003cp\u003eProtocols 21\u003c\/p\u003e \u003cp\u003eReify 22\u003c\/p\u003e \u003cp\u003ePersistent Data Structures 23\u003c\/p\u003e \u003cp\u003eShaping the Language 27\u003c\/p\u003e \u003cp\u003eSummary 29\u003c\/p\u003e \u003cp\u003e\u003cb\u003eCHAPTER 2: RAPID FEEDBACK CYCLES WITH CLOJURE 31\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eREPL-Driven Development 32\u003c\/p\u003e \u003cp\u003eBasic REPL Usage with Leiningen 32\u003c\/p\u003e \u003cp\u003eRemote REPLs with nREPL 34\u003c\/p\u003e \u003cp\u003eREPL Usage with a Real Application 35\u003c\/p\u003e \u003cp\u003eConnecting Your Editor to a REPL 39\u003c\/p\u003e \u003cp\u003eReloading Code 40\u003c\/p\u003e \u003cp\u003eReloading Code from the REPL 40\u003c\/p\u003e \u003cp\u003eAutomatically Reloading Code 43\u003c\/p\u003e \u003cp\u003eWriting Reloadable Code 49\u003c\/p\u003e \u003cp\u003eSummary 51\u003c\/p\u003e \u003cp\u003e\u003cb\u003eCHAPTER 3: WEB SERVICES 53\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eProject Overview 53\u003c\/p\u003e \u003cp\u003eNamespace Layout 54\u003c\/p\u003e \u003cp\u003eElements of a Web Service 55\u003c\/p\u003e \u003cp\u003eLibraries, Not Frameworks 55\u003c\/p\u003e \u003cp\u003eHTTP 55\u003c\/p\u003e \u003cp\u003eRouting 64\u003c\/p\u003e \u003cp\u003eJSON Endpoints 70\u003c\/p\u003e \u003cp\u003eExample Service 74\u003c\/p\u003e \u003cp\u003eCreate the Project 75\u003c\/p\u003e \u003cp\u003eAdditional Namespaces 75\u003c\/p\u003e \u003cp\u003eDefault Middleware 77\u003c\/p\u003e \u003cp\u003eThe Storage Protocol 78\u003c\/p\u003e \u003cp\u003eHandlers 83\u003c\/p\u003e \u003cp\u003eMiddleware 88\u003c\/p\u003e \u003cp\u003eRoutes 89\u003c\/p\u003e \u003cp\u003eDeployment 94\u003c\/p\u003e \u003cp\u003eUsing Leiningen 94\u003c\/p\u003e \u003cp\u003eCompiling an Uberjar or Uberwar 95\u003c\/p\u003e \u003cp\u003eHosting 96\u003c\/p\u003e \u003cp\u003eSummary 97\u003c\/p\u003e \u003cp\u003e\u003cb\u003eCHAPTER 4: TESTING 99\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eTesting Basics with clojure.test 100\u003c\/p\u003e \u003cp\u003ewith-test 101\u003c\/p\u003e \u003cp\u003edeftest 101\u003c\/p\u003e \u003cp\u003eare 102\u003c\/p\u003e \u003cp\u003eUsing Fixtures 103\u003c\/p\u003e \u003cp\u003eTesting Strategies 104\u003c\/p\u003e \u003cp\u003eTests Against DB 104\u003c\/p\u003e \u003cp\u003eTesting Ring Handlers 106\u003c\/p\u003e \u003cp\u003eMocking\/Stubbing Using with-redefs 108\u003c\/p\u003e \u003cp\u003eRedefining Dynamic Vars 110\u003c\/p\u003e \u003cp\u003eRecord\/Replay with VCR 111\u003c\/p\u003e \u003cp\u003eMeasuring Code Quality 112\u003c\/p\u003e \u003cp\u003eCode Coverage with Cloverage 112\u003c\/p\u003e \u003cp\u003eStatic Analysis with kibit and bikeshed 114\u003c\/p\u003e \u003cp\u003eKeeping Dependencies Under Control 116\u003c\/p\u003e \u003cp\u003eTesting Framework Alternatives 119\u003c\/p\u003e \u003cp\u003eExpectations 119\u003c\/p\u003e \u003cp\u003eSpeclj 119\u003c\/p\u003e \u003cp\u003eCucumber 120\u003c\/p\u003e \u003cp\u003eKerodon 126\u003c\/p\u003e \u003cp\u003eSummary 127\u003c\/p\u003e \u003cp\u003e\u003cb\u003eCHAPTER 5: REACTIVE WEB PAGES IN CLOJURESCRIPT 129\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eClojureScript Is a Big Deal 129\u003c\/p\u003e \u003cp\u003eA First Brush with ClojureScript 131\u003c\/p\u003e \u003cp\u003eStarting a New ClojureScript Project 132\u003c\/p\u003e \u003cp\u003eGetting Fast Feedback with Figwheel 132\u003c\/p\u003e \u003cp\u003eCreating Components 134\u003c\/p\u003e \u003cp\u003eModeling the Data 135\u003c\/p\u003e \u003cp\u003eResponding to Events and Handling State Change 136\u003c\/p\u003e \u003cp\u003eUnderstanding Errors and Warnings 137\u003c\/p\u003e \u003cp\u003eNamespace Layout 141\u003c\/p\u003e \u003cp\u003eStyling 141\u003c\/p\u003e \u003cp\u003eForm Inputs and Form Handling 142\u003c\/p\u003e \u003cp\u003eNavigation and Routes 145\u003c\/p\u003e \u003cp\u003eHTTP Calls: Talking to a Server 147\u003c\/p\u003e \u003cp\u003eDrag and Drop 149\u003c\/p\u003e \u003cp\u003ePublishing 150\u003c\/p\u003e \u003cp\u003eReagent in Depth 151\u003c\/p\u003e \u003cp\u003eForm 1: A Function That Returns a Vector 151\u003c\/p\u003e \u003cp\u003eForm 2: A Function That Returns a Component 152\u003c\/p\u003e \u003cp\u003eForm 3: A Function That Returns a Class 153\u003c\/p\u003e \u003cp\u003eSequences and Keys 154\u003c\/p\u003e \u003cp\u003eCustom Markup 155\u003c\/p\u003e \u003cp\u003eReactions 156\u003c\/p\u003e \u003cp\u003eA Note on Style 158\u003c\/p\u003e \u003cp\u003eTesting Components with Devcards 159\u003c\/p\u003e \u003cp\u003eInterop with JavaScript 162\u003c\/p\u003e \u003cp\u003eOne Language, One Idiom, Many Platforms 164\u003c\/p\u003e \u003cp\u003eThings to Know About the Closure Compiler and Library 164\u003c\/p\u003e \u003cp\u003eModeling State with DataScript 165\u003c\/p\u003e \u003cp\u003eGo Routines in Your Browser with core.async 166\u003c\/p\u003e \u003cp\u003eSummary 167\u003c\/p\u003e \u003cp\u003e\u003cb\u003eCHAPTER 6: THE DATOMIC DATABASE 169\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eDatomic Basics 170\u003c\/p\u003e \u003cp\u003eWhy Datomic? 170\u003c\/p\u003e \u003cp\u003eThe Datomic Data Model 172\u003c\/p\u003e \u003cp\u003eQuerying 175\u003c\/p\u003e \u003cp\u003eTransactions 181\u003c\/p\u003e \u003cp\u003eIndexes Really Tie Your Data Together 183\u003c\/p\u003e \u003cp\u003eDatomic’s Unique Architecture 187\u003c\/p\u003e \u003cp\u003eModeling Application Data 188\u003c\/p\u003e \u003cp\u003eExample Schema for Task Tracker App 188\u003c\/p\u003e \u003cp\u003eEntity ids and Partitions 196\u003c\/p\u003e \u003cp\u003eDatomic’s Clojure API 197\u003c\/p\u003e \u003cp\u003eBasic Setup 197\u003c\/p\u003e \u003cp\u003eExperimenting in the REPL 200\u003c\/p\u003e \u003cp\u003eBuilding Applications with Datomic 206\u003c\/p\u003e \u003cp\u003eUser Functions 206\u003c\/p\u003e \u003cp\u003eAccount Functions 209\u003c\/p\u003e \u003cp\u003eTask Functions 210\u003c\/p\u003e \u003cp\u003eDeployment 213\u003c\/p\u003e \u003cp\u003eThe Limitations 214\u003c\/p\u003e \u003cp\u003eSummary 215\u003c\/p\u003e \u003cp\u003e\u003cb\u003eCHAPTER 7: PERFORMANCE 217\u003c\/b\u003e\u003c\/p\u003e \u003cp\u003eWhat Is Performance? 219\u003c\/p\u003e \u003cp\u003eChoosing the Right Data Structure Is a Prerequisite for Performance 219\u003c\/p\u003e \u003cp\u003eBenchmarking 221\u003c\/p\u003e \u003cp\u003eTiming Slow Things 221\u003c\/p\u003e \u003cp\u003eUse Criterium for Timing Fast Things 223\u003c\/p\u003e \u003cp\u003eUse Test Selectors for Performance Tests 225\u003c\/p\u003e \u003cp\u003eParallelism 225\u003c\/p\u003e \u003cp\u003eMemoization 226\u003c\/p\u003e \u003cp\u003eInlining 227\u003c\/p\u003e \u003cp\u003ePersistent Data Structures 228\u003c\/p\u003e \u003cp\u003eSafe Mutation with Transients 228\u003c\/p\u003e \u003cp\u003eProfi ling 229\u003c\/p\u003e \u003cp\u003eAvoiding Reflection with Type Hinting 230\u003c\/p\u003e \u003cp\u003eJava Flags 232\u003c\/p\u003e \u003cp\u003eMath 232\u003c\/p\u003e \u003cp\u003eSummary 232\u003c\/p\u003e \u003cp\u003eINDEX 235\u003c\/p\u003e","brand":"John Wiley \u0026 Sons Inc","offers":[{"title":"Default Title","offer_id":49407024005463,"sku":"9781119267270","price":36.09,"currency_code":"GBP","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0817\/1739\/5799\/files\/9781119267270.jpg?v=1730497909","url":"https:\/\/bookcurl.com\/products\/professional-clojure-9781119267270","provider":"Book Curl","version":"1.0","type":"link"}