Avi Drucker / Apr 28 2021 / Published
Remix of Clojure by Nextjournal
Clojure Koans 19 Datatypes Notebook
Spoilers to the Clojure Koans exercises below!
Original Clojure Koans repository: https://github.com/functional-koans/clojure-koans/
{:deps {org.clojure/clojure {:mvn/version "1.10.1"}
;; complient is used for autocompletion
;; add your libs here (and restart the runtime to pick up changes)
compliment/compliment {:mvn/version "0.3.9"}}}
deps.edn
Extensible Data Notation
{:hello (clojure-version)}
0.1s
Clojure
Initial Thoughts
...
(defrecord Nobel [prize])
;; question 19001: What is the function/role of `prize` here? It doesn't appear to be defined as per syntax I have seen before...
;; question 19002: Is prize an attribute/property or something else?
Clojure
(deftype Pulitzer [prize]) ;; question: What is `deftype`?
;; question 19003: What exactly is `defrecord`, and what is its role and function?
;; question 19004: Why use a record or a type in Clojure?
Clojure
(defprotocol Award
(present [this recipient]))
;; description: An protocol named "Award" is created/defined (?) here with
;; a present "method"/function (?)
;; which takes (two parameters?)
;; a this instance (?)
;; and a recipient string (?).
;; question 19005: What is `defprotocol`?
;; answer 19005a: A protocol is similar to an interface. (?)
;; question 19006: What can you do with protocols?
;; answer 19006a: With protocols, you can define interfaces for records and for types.
Clojure
(defrecord Oscar [category]
Award
(present [this recipient]
(print (str "Congratulations on your "
(:category this) " Oscar, "
recipient
"!"))))
;; description: The Oscar record implements the Award protocol. The `this` refers to the instance of the Oscar.
;; skill 19001: Create a record which implements a protocol.
;; question 19007: What are typical/common/useful example protocols?
Clojure
(deftype Razzie [category]
Award
(present [this recipient]
(print (str "You're really the " (.category this) ", " recipient "... sorry."))))
;; skill 19002: Create a type (?) which implements a protocol
;; question 19008: How are types typically (hah) referred to in Clojure? "deftypes", types, or something else?
Clojure
;; "Holding records is meaningful only when the record is worthy of you"
(= "peace" (.prize (Nobel. "peace")))
;; description: Create an instance of a Nobel record with one argument of "peace", then access its "prize" attribute
;; question 19009: What is a record in Clojure?
;; question 19010: What is the dot "." prefix meaning in Clojure?
;; question 19011: What is the dot "." suffix meaning in Clojure?
;; answer 19011a: The dot suffix indicates a constructor function which creates an instance here of records.
;; skill 19003: Construct an "instance" of a type by using `defrecord` (?)
Clojure
;; "Types are quite similar"
(= "literature" (.prize (Pulitzer. "literature")))
;; question 19012: How are types and records different in Clojure? Why have both?
;; question 19013: What is `.prize` here functioning as? Is "accessor" or "getter" the preferred way to label it, or is there a better/more accepted/correct term?
Clojure
;; "Records may be treated like maps"
(= "physics" (:prize (Nobel. "physics")))
Clojure
;; "While types may not"
(= nil (:prize (Pulitzer. "poetry")))
;; question 19018: What is the utility of this info, "Records may be treated like maps by using keywords to access properties/attributes, but types do not allow for this map-like access." ?
;; question 19014: What is the implementation behind-the-scenes of types in Clojure?
Clojure
;; "Further study reveals why"
(= [true false]
(map map? [(Nobel. "chemistry")
(Pulitzer. "music")]))
;; question 19015: If records are maps (in implementation, functionality, or both?), then what are the differences between records and maps?
Clojure
;; "Either sort of datatype can define methods in a protocol"
(= "Congratulations on your Best Picture Oscar, Evil Alien Conquerors!"
(with-out-str (present (Oscar. "Best Picture") "Evil Alien Conquerors")))
;; question 19016: What is a protocol in Clojure?
Clojure
;; "Surely we can implement our own by now"
(= "You're really the Worst Picture, Final Destination 5... sorry."
(with-out-str (present (Razzie. "Worst Picture") "Final Destination 5")))
;; question 19017: Are deftype and defrecord used often by Clojure developers?
Clojure
Closing Thoughts
...