Hello there.

I was working on implementing a specification compliant edn reader on
Rust, and I found that clojure.edn/read itself isn't specification
compliant.

I have three examples below that should all throw exceptions, but
instead they are valid values according to clojure.edn/read. The quotes
were taken verbatim from the text of the specification[0].

--8<---------------cut here---------------start------------->8---
;; "Per the symbol rules above, :/ and :/anything are not legal keywords."
[(edn/read-string ":/")
 ;; "It can be used once only in the middle of a symbol to separate
the _prefix_ (often a namespace) from the _name
_"
 (name (edn/read-string "a/b/c"))

 ;; specification doesn't talk about namespaced maps
 (edn/read-string "#:a{:k 1}")]

[:/ "b/c" #:a{:k 1}]
--8<---------------cut here---------------end--------------->8---

I couldn't find many references to these issues, other than a Jira
ticket[1] and a thread on clojure-dev[2]. Both talk about
clojure.edn/read being consistent with LispReader, though. I have no
opinions on that.

Since the clojure.edn/read is an edn reader, shouldn't it comply with
the edn specification? Maybe not the namespaced maps parts, which the
specification itself could be extended to cover. But the other two cases
are explicitly forbidden on the specification, and clojure.edn/read
allows them.

I'm willing to write a patch to fix those, but is it something that
would be welcome? One could consider it a breaking change since the
reader will stop accepting data that is now does, but I could also argue
that this is a bug on the reader that was fixed, and the behaviour was
changed to match the expected behaviour, which is the specification.

The specification itself could change to match the behaviour of the
reader, but this is not desirable since it would invalidate the work
that others have done to implement edn outside of Clojure.

The tension between breaking the reader and matching the specification
should, IMHO, be favoured towards the matching the specification.
Otherwise, the actual specification isn't what edn-format.org says, but
it would instead be "whatever clojure.edn/read does", which is worse.
The value proposition of having an specification to begin with is lost.

WDYT? Is there any other resource on this that I missed?

[0]: 
https://raw.githubusercontent.com/edn-format/edn/a51127aecd318096667ae0dafa25353ecb07c9c3/README.md
[1]: https://clojure.atlassian.net/browse/CLJ-1530
[2]: https://groups.google.com/g/clojure-dev/c/b09WvRR90Zc/discussion

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@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+unsubscr...@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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/clojure/87h7qxdr5y.fsf%40euandre.org.

Reply via email to