Search code examples
clojure

Clojure: Should I prepend new- or make- to constructor functions?


When creating a new Java object via a wrapper function, what is the "constructor" naming standard? Should I prepend make- or new- to the function name? Or just call it the type of thing it returns? At one point I got accustomed to using make- because it's the way it was done in the Scheme book SICP.

For example, I'm passing some stuff to a function which eventually returns an instance of a Java class. Here are a few examples:

(def myimage1 (make-image "img.svg" 100 200))  ; These all return
(def myimage2 (new-image "img.svg" 100 200))   ; an instance of
(def myimage3 (image "img.svg" 100 200))       ; javafx.scene.image.Image

Is it the same for creating Clojure-only structs, such as maps, etc?:

(def mystruct1 (make-custom-struct args))
(def mystruct2 (new-custom-struct args))
(def mystruct3 (custom-struct args))

I prefer the last version without make- or new-, but often times the binding (for example inside a let) would have the same name, which would suggest prepending the constructor name, or using a different binding name, such as:

(let [image (make-image "img.svg" 100 200)] ...)
(let [imuj (image "img.svg" 100 200)] ...)

However other times I'd just like to use the function in-line without the cluttering of the new- or `make-':

(do-something-with-an-image (image "img.svg" 100 200))

Solution

  • Stuart Sierra suggests not using a prefix. His idea is that a pure function can be replaced with its implementation, and so a simple noun makes a better name in that sense than a verb.