This commit is contained in:
Matthew Davidson 2023-01-04 17:07:13 +01:00
parent 5674c49c3a
commit 91bccfa55f

View file

@ -7,13 +7,13 @@
(meditations
"Some objects can be tagged using the with-meta function"
(= __ (meta giants))
(= {:league "National League"} (meta giants))
"Or more succinctly with a reader macro"
(= __ (meta '^{:division "West"} Giants))
(= {:division "West"} (meta '^{:division "West"} Giants))
"While others can't"
(= __ (try
(= "This doesn't implement the IObj interface" (try
(with-meta
2
{:prime true})
@ -21,31 +21,31 @@
"This doesn't implement the IObj interface")))
"Notice when metadata carries over"
(= __ (meta (merge '^{:foo :bar} {:a 1 :b 2}
(= {:foo :bar} (meta (merge '^{:foo :bar} {:a 1 :b 2}
{:b 3 :c 4})))
"And when it doesn't"
(= __ (meta (merge {:a 1 :b 2}
(= nil (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"))
(= \C (#(.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)) __)
(swap! (:world-series-titles (meta giants)) inc)
@(:world-series-titles (meta giants))))
"You can also create a new object from another object with metadata"
(= {:league "National League" :park "Oracle Park"}
(meta (vary-meta giants
assoc __ __)))
assoc :league "National League" :park "Oracle Park")))
"But it won't affect behavior like equality"
(= __ (vary-meta giants dissoc :league))
(= giants (vary-meta giants dissoc :league))
"Or the object's printed representation"
(= __ (pr-str (vary-meta giants dissoc :league))))
(= "Giants" (pr-str (vary-meta giants dissoc :league))))