News for hackers. Stuff that matters.
Re:Clojure 2014 Year in Review by adambard on Friday January 02, 2015 @07:37PM (#8829391)
> Personally, I like Clojure (which I am just learning now) in spite of the lack of objects. I think that the ability to write a Point class, encapsulate the coordinates, and expose an API is great. In my opinion, representing a Point as a vector or map, and then having a set of unassociated functions operating on these point-like collections sacrifices some good ideas that came from object-orientation.

Since you mentioned you were learning, I thought I'd share that, although I like functions-on-data as much as the next guy, I often use protocols and records for tasks like this, generally for no reason other than organization and self-documentation:

    (defprotocol Pointy
      (add-vectors [this other])
      ; ...
    )

    (defrecord Point
      Pointy
      (add-vectors [{this-x :x this-y :y} {other-x :x other-y :y}]
        (->Point (+ this-x other-x) (+ this-y other-y)))
      ;...
    )
I think this has more to do with type-safety than object-orientation though.
Re:Clojure 2014 Year in Review by weavejester on Saturday January 03, 2015 @10:17AM (#8830900)
Protocols and records exist purely for polymorphism. If you want type safety, then perhaps try core.typed:

    (defalias Point
      (HMap :mandatory {:x Num, :y Num}
            :complete? true))

    (ann add-vectors [Point Point -> Point])
    (defn add-vectors [a b]
      {:x (+ (:x a) (:x b))
       :y (+ (:y a) (:y b))})