From 173dd560d746882e7ae48ad1bb47b7fb25ce6937 Mon Sep 17 00:00:00 2001 From: Bryant Date: Sun, 12 Jul 2015 13:03:34 -0700 Subject: [PATCH] Add koan for metadata --- resources/koans.clj | 10 +++++++++ src/koans/22_meta.clj | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/koans/22_meta.clj diff --git a/resources/koans.clj b/resources/koans.clj index a8bffb4..19dddc6 100644 --- a/resources/koans.clj +++ b/resources/koans.clj @@ -219,4 +219,14 @@ {:naughty-list [{:name "Jimmy" :bad true} {:name "Joe" :bad true}] :nice-list [{:name "Jane" :bad false}]}]}] + ["22_meta" {"__" [{:league "National League"} + {:division "West"} + "This doesn't implement the IObj interface" + {:foo :bar} + nil + \C + inc + :park "AT&T Park" + 'Giants + "Giants"]}] ] diff --git a/src/koans/22_meta.clj b/src/koans/22_meta.clj new file mode 100644 index 0000000..7d69081 --- /dev/null +++ b/src/koans/22_meta.clj @@ -0,0 +1,51 @@ +(ns koans.22-meta + (:require [koan-engine.core :refer :all])) + +(def giants + (with-meta 'Giants + {:league "National League"})) + +(meditations + "Some objects can be tagged using the with-meta function" + (= __ (meta giants)) + + "Or more succintly with a reader macro" + (= __ (meta '^{:division "West"} Giants)) + + "While others can't" + (= __ (try + (with-meta + 2 + {:prime true}) + (catch ClassCastException e + "This doesn't implement the IObj interface"))) + + "Notice when metadata carries over" + (= __ (meta (merge '^{:foo :bar} {:a 1 :b 2} + {:b 3 :c 4}))) + + "And when it doesn't" + (= __ (meta (merge {:a 1 :b 2} + '^{:foo :bar} {:b 3 :c 4}))) + + "Metadata can be used as a type hint to avoid reflection during runtime" + (= __ (#(.charAt ^String % 0) "Cast me")) + + "You can directly update an object's metadata" + (= 8 (let [giants + (with-meta + 'Giants + {:world-series-titles (atom 7)})] + (swap! (:world-series-titles (meta giants)) __) + @(:world-series-titles (meta giants)))) + + "You can also create a new object from another object with metadata" + (= {:league "National League" :park "AT&T Park"} + (meta (vary-meta giants + assoc __ __))) + + "But it won't affect behavior like equality" + (= __ (vary-meta giants dissoc :league)) + + "Or the object's printed representation" + (= __ (pr-str (vary-meta giants dissoc :league))))