Skip to content

Commit

Permalink
Add some examples for threading macros and a couple of simple transdu…
Browse files Browse the repository at this point in the history
…cer koans
  • Loading branch information
the-frey authored and trptcolin committed Sep 23, 2019
1 parent 9481906 commit ba141d0
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 6 deletions.
25 changes: 19 additions & 6 deletions resources/koans.clj
Original file line number Diff line number Diff line change
Expand Up @@ -259,11 +259,24 @@
"Giants"]}]

["24_macros" {"__" [~(first form)
~(nth form 2)
form
(drop 2 form)
"Hello, Macros!"
10
'(+ 9 1)]}]
~(nth form 2)
form
(drop 2 form)
"Hello, Macros!"
10
'(+ 9 1)]}]

["25_threading_macros" {"__" [{:a 1}
"Hello world, and moon, and stars"
"String with a trailing space"
6
1
[2 3 4]
12
[1 2 3]]}]

["26_transducers" {"__" [[2 4]
[2 4]
[2 4]
6]}]
]
70 changes: 70 additions & 0 deletions src/koans/25_threading_macros.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
(ns koans.25-threading-macros
(:require [koan-engine.core :refer :all]))

(def a-list
'(1 2 3 4 5))

(def a-list-with-maps
'({:a 1} {:a 2} {:a 3}))

(defn function-that-takes-a-map [m a b]
(do
(println (str "Other unused arguments: " a " " b))
(get m :a)))

(defn function-that-takes-a-coll [a b coll]
(do
(println (str "Other unused arguments: " a " " b))
(map :a coll)))

(meditations
"We can use thread first for more readable sequential operations"
(= __
(-> {}
(assoc :a 1)))

"Consider also the case of strings"
(= __
(-> "Hello world"
(str ", and moon")
(str ", and stars")))

"When a function has no arguments to partially apply, just reference it"
(= __
(-> "String with a trailing space "
clojure.string/trim))

"Most operations that take a scalar value as an argument can be threaded-first"
(= __
(-> {}
(assoc :a 1)
(assoc :b 2)
(assoc :c {:d 4
:e 5})
(update-in [:c :e] inc)
(get-in [:c :e])))

"We can use functions we have written ourselves that follow this pattern"
(= __
(-> {}
(assoc :a 1)
(function-that-takes-a-map "hello" "there")))

"We can also thread last using ->>"
(= __
(->> [1 2 3]
(map inc)))

"Most operations that take a collection can be threaded-last"
(= __
(->> a-list
(map inc)
(filter even?)
(into [])
(reduce +)))

"We can use funtions we have written ourselves that follow this pattern"
(= __
(->> a-list-with-maps
(function-that-takes-a-coll "hello" "there")
(into []))))
23 changes: 23 additions & 0 deletions src/koans/26_transducers.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
(ns koans.26-transducers
(:require [koan-engine.core :refer :all]))

(def xfms
(comp (map inc)
(filter even?)))

(meditations
"Consider that sequence operations can be used as transducers"
(= __
(transduce xfms conj [1 2 3]))

"We can do this eagerly"
(= __
(into [] xfms [1 2 3]))

"Or lazily"
(= __
(sequence xfms [1 2 3]))

"The transduce function can combine mapping and reduction"
(= __
(transduce xfms + [1 2 3])))

0 comments on commit ba141d0

Please sign in to comment.