user=> (doc read-string)
-------------------------
clojure.core/read-string
([s])
  Reads *one* object from the string s
nil
(emphasis on *one* by me)

one object from ":a(" = :a; ":a)" = :a; "( … " = fail; ")…" = fail. (remember 
whitespace in front of a paren doesn't matter)

Have fun.

From: noahlz <nzuc...@gmail.com<mailto:nzuc...@gmail.com>>
Reply-To: Clojure <clojure@googlegroups.com<mailto:clojure@googlegroups.com>>
Date: Monday, April 29, 2013 16:26
To: Clojure <clojure@googlegroups.com<mailto:clojure@googlegroups.com>>
Subject: Understanding unmatched parenthesis in read-string

(Disclaimer: I post this aware that read-string is considered dangerous for 
untrusted code and having starred tools.reader)

I was writing some code using read-string and encountered the following 
(somewhat odd?) behavior:

Clojure 1.5.1
user=> (read-string "1000N(")
1000N
user=> (read-string "1000N)")
1000N
user=> (read-string "(1000N")
RuntimeException EOF while reading  clojure.lang.Util.runtimeException 
(Util.java:219)

user=> (read-string ")1000N")
RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException 
(Util.java:219)


So if the string ends with an unmatched ) or (, the preceding value gets 
returned and the unmatched character discarded. But if the string starts with 
an unmatched parens - EOF (as expected). I was a little surprised as I expected 
the first to cases to throw some kind of RuntimeException.

What is the explanation for this behavior if any, and where can I go / read 
more about the underlying theory of "correctly" handling this case? I'm aware 
that lexical parsing is a big topic - just wondering what the ruling was here 
(if any) and looking for a jumping off point into further readings. Also if 
this was discussed elsewhere (searching "read-string unmatched paren" yielded 
nothing).

Thanks!


--
--
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<mailto: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<mailto: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<mailto:clojure+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/groups/opt_out.


-- 
-- 
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.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to