protocol-ize with-open
Description
Environment
Attachments
- 13 Apr 2012, 05:23 PM
Activity

Enzzo Cavallo May 19, 2020 at 11:37 PM
Since clojure 1.10, Clojure only support java 8+, so AutoClosable can be used without any problem
There is some way to not break dynamic dispatch?
extend-with-metadata can be used?
https://github.com/clojure/clojure/blob/master/changes.md#11-java

Tassilo Horn July 23, 2014 at 1:12 PM
Hi Brandon, two questions:
Could 1) be circumvented somehow by providing a default implementation somehow? I guess the protocol could be extended upon Object with implementation (.close this), but that would give a reflection warning since Object has no close method. Probably one could extend upon Object and in the implementation search a "close" method using java.lang.reflect and throw an exception if none could be found?
Could you please tell me a bit more about the :on-interface option? How does that differ from extend? And how do I add the implementation, i.e., (.close this) with that option?

Brandon Bloom July 23, 2014 at 3:00 AM
I looked up this ticket because I ran in to a reflection warning: with-open does not hint it's binding with java.io.Closeable
Some feedback on the patch:
1) This is a breaking change for anyone relying on the close method to be duck-typed.
2) CloseableResource is a bit long. clojure.core.protocols.Closeable is plenty unambiguous.
3) Rather than extending CloseableResource to java.io.Closeable, you can use the little known (undocumented? unsupported?) :on-interface directive:
(defprotocol Closeable
:on-interface java.io.Closeable
(close [this]))
That would perform much better than the existing patch.

Tassilo Horn April 13, 2012 at 5:23 PM
Updated patch to apply cleanly against master again.

Andy Fingerhut April 2, 2012 at 6:11 PM
Patch 0001-Added-ClosableResource-protocol-for-with-open.patch dated 08/Mar/12 applies, builds, and tests cleanly on latest master as of Apr 2 2012. Tassilo has signed a CA.
Good use (and documentation example) of protocols: make with-open aware of a Closable protocol for APIs that use a different close convention. See http://groups.google.com/group/clojure/browse_thread/thread/86c87e1fc4b1347c