Writing Elegant Clojure Code Using Higher-Order Functions
christophermaier.name
christophermaier.name
(defn flatten [x] (apply concat x))
It flattens one-level of nested lists ( like [[1 2] [3 4]] -> [1 2 3 4]) and even works when x is an infinite generated sequence. On the other hand brevity is not always clarity so HOF tricks should be treated with caution.1) This only works if everything is really a seq so [[1 2][3 4] 5] does not work 2) the name is not optimal
If you come from a javascript background, you will have a leg up on most people in terms of learning clojure. You get used to inlining functions pretty regularly.
What I am encountering as I chew through Programming Clojure though is that I had no idea what I could have been doing in javascript all this time. I would look at C and laugh about how they have to define an extra function for event handling. It just seemed so verbose.
Looking back at the javascript I wrote/write, I really wish I had understood what I could have been doing with functions, mappings, and apply. I didn't/don't write javascript: it's just C with some in-lined functions.
Moral of the story: Inhale the Zen of Crockford(http://javascript.crockford.com/) and exhale the suck of W3 schools.
You'd be better off listing the languages that don't have some sort of 'inline functions' than claims about javascript superiority here; Heres a handful of common imperative/OO languages that have an analogous construction: Python, Ruby, C#, Visual Freaking Basic Dot Net, Smalltalk, Objective C and other C languages with Apple's blocks extension, probably PHP and Lua…
Python doesn't allow you to mutate variables from enclosing scopes (by default, at least).
Ruby's blocks aren't first-class, they have to be converted to a Proc object first (and argument passing works differently than for methods).
Smalltalk blocks don't have to be able to call themselves recursively by the ANSI standard (most implementations allow that, but eg. Squeak/Pharo does not by default).
C on OSX doesn't have GC, so you have to manually specify which variables you want to capture (and how).
JavaScript was originally supposed to be Scheme, and thus has implemented lexical closures better than most other languages. ('this' however... don't want to talk about that train wreck)