Feedback on datafy/nav project

153 views
Skip to first unread message

dimitris

unread,
Jan 30, 2020, 12:05:21 PM1/30/20
to Clojure
Hi folks,

I'm looking for honest and constructive feedback on [1] - not so much
about the actual implementation (even though these are welcome too), but
rather about the general idea of basing everything on top of (mirrored
versions) `datafy` and `nav` (in this way). There is a TL;DR section at
the very bottom that describes the approach in 4 short sentences.

Many thanks in advance,

Dimitris

[1]: https://github.com/jimpil/jedi-time


Sean Corfield

unread,
Jan 30, 2020, 12:50:31 PM1/30/20
to clo...@googlegroups.com

Is there a reason you’ve mirrored those protocols/implementations rather than just use Clojure’s built-in versions?

 

As it stands, your library wouldn’t work with other tooling that builds on Clojure’s datafy/nav (REBL, for example).

 

Sean Corfield -- (904) 302-SEAN
An Architect's View -- http://corfield.org/

"If you're not annoying somebody, you're not really alive."
-- Margaret Atwood

--

You received this message because you are subscribed to the Google

Groups "Clojure" group.

To post to this group, send email to clo...@googlegroups.com

Note that posts from new members are moderated - please be patient with your first post.

To unsubscribe from this group, send email to

clojure+u...@googlegroups.com

For more options, visit this group at

http://groups.google.com/group/clojure?hl=en

---

You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/d0db9e09-6419-2e13-3a0b-9bacf2bbf4fd%40gmail.com.

 

dimitris

unread,
Jan 30, 2020, 12:58:32 PM1/30/20
to clo...@googlegroups.com

Well, the official Clojure guidelines are to NOT extend protocols, unless you own either the protocol of the type(s) [1].

In particular these lines:

If you are a library developer, you should not extend if you own neither the protocol nor the target.

You should take particular care when extending protocols included with Clojure itself.


Kind regards,

Dimitris

[1]: https://clojure.org/reference/protocols#_extend_via_metadata

dimitris

unread,
Jan 30, 2020, 1:28:20 PM1/30/20
to clo...@googlegroups.com

Moreover, following the mailing discussion linked from the clojure.org site, leads to the following quote from Rich - about 10 years ago :)

If a protocol comes with Clojure itself, avoid extending it to types
you don't own, especially e.g. java.lang.String and other core Java
interfaces. Rest assured if a protocol should extend to it, it will,
else lobby for it.

Christian Gonzalez

unread,
Jan 30, 2020, 1:39:25 PM1/30/20
to Clojure
I think you could also add some metadata to allow datafy-ing instead of extending the protocol:

(with-meta {:name "John Doe" :language "us"} {`clojure.core.protocols/datafy (fn [x] ...)})

For more options, visit this group at

http://groups.google.com/group/clojure?hl=en

---

You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

dimitris

unread,
Jan 30, 2020, 1:52:45 PM1/30/20
to clo...@googlegroups.com

Hmmm... how would that work? I want datafy to work on java.time objects - not Clojure maps (as you showed).


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/a0a471ae-c4c6-4b92-86a6-5cefe099bdd7%40googlegroups.com.

Sean Corfield

unread,
Jan 30, 2020, 8:23:46 PM1/30/20
to clo...@googlegroups.com

If your library is intended specifically to provide the ability to datafy/nav java.time objects then it is something optional that users can choose to opt into.

 

The section you meant to link to https://clojure.org/reference/protocols#_guidelines_for_extension says: “To minimize conflicts, consider these guidelines”

 

So they’re a) guidelines and b) just given as a caution to minimize conflicts.

 

There are libraries out there already that exist specifically to give users the option to extend protocols from one library (such as clojure.java.jdbc or next.jdbc) to Java types to provide customized behavior, above and beyond the “base versions for common targets” mentioned in that section provided by the original library.

 

I see benefit in libraries that extend Clojure’s datafy/nav to new domains as a narrow purpose that users can opt into. I see much less benefit in providing the same protocols and function names that core already includes, targeted to new types, in an isolated way such as this. Perhaps that is because I’m already using datafy/nav and I find their utility is enhanced by being extended to other Java types?

 

Yes, if multiple people write multiple libraries A, B, C that extend datafy/nav to java.time types and then other libraries X, Y, Z start pulling in those extenders, consumers of X, Y, Z can be in trouble.

dimitris

unread,
Jan 31, 2020, 2:24:09 PM1/31/20
to clo...@googlegroups.com

I tend to agree with you in where the benefit is - it's just that the way the protocol docs are phrased, and some of the language used in that mailing discussion from 10 years ago (from authoritative sources like Rich and Stuart), implies that no library is to extend clojure.core protocols to core Java objects, and that only Clojure itself is allowed do that. The example Stuart gave back then with the english/spelling-corrector VS spanish/spelling-corrector is pretty telling...

Could it perhaps be the case that `Datafiable` is somewhat special in that, it was conceived for the purpose of open extension by third parties, and that the protocol extension guidelines don't really apply to it (or perhaps not as strictly)? 


Thanks for taking the time :)

Dimitris

Alex Miller

unread,
Jan 31, 2020, 4:13:27 PM1/31/20
to Clojure
Datafiable is not special, the guidelines (recently refreshed with Rich's input at https://clojure.org/reference/protocols#_guidelines_for_extension) still make sense, but are still just guidelines for your thinking not Laws whose breakage will land you in Clojure Jail.

If you want to make protocol extensions for java time objects to datafiable and put it in a lib, go for it. No one is making anyone else use it. Maybe some day we'll do that in core, maybe not.

I'm certain that copying Datafiable to your own version however would lead only to a) confusion and b) a certainty that no one else would actually use it, and that seems like a waste of time.

For more options, visit this group at

http://groups.google.com/group/clojure?hl=en

---

You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscribe@googlegroups.com.

dimitris

unread,
Jan 31, 2020, 4:23:36 PM1/31/20
to clo...@googlegroups.com

Ok, thanks a million Alex


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/2a321799-425b-424e-afd1-b7071d38de1d%40googlegroups.com.

Sean Corfield

unread,
Jan 31, 2020, 4:34:51 PM1/31/20
to clo...@googlegroups.com

Dimitris,

 

As a follow-up to Alex’s comments: if you change your lib to extend the clojure.datafy version, I’ll almost certainly use your library 😊

For more options, visit this group at

http://groups.google.com/group/clojure?hl=en

---

You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

dimitris

unread,
Jan 31, 2020, 4:50:31 PM1/31/20
to clo...@googlegroups.com

Sean,

I've already done that ;)

I will publish to clojars either this weekend or the next - I just want to add some more tests...

Derek Troy-West

unread,
Jan 31, 2020, 6:56:20 PM1/31/20
to Clojure
Hi Dimitris.

I think your library is an excellent idea. Like the other replies I'd prefer if it used Datafiable.

Would you consider adopting an explicit options map instead of the jdt/now! varags destructuring? I'm not sure if that style is adopted throughout, but in general I prefer maps to the syntactic sugar.

Finally, just a suggestion that 'objectify' might be a bit more explicit in intent to 'undatafy'.

I look forward to getting it in the REPL once it's up on clojars, thanks!

For more options, visit this group at

http://groups.google.com/group/clojure?hl=en

---

You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to


For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.

To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to

For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clo...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages