为什么当`read-line`返回一个字符串时`read`返回一个符号
我正在通过遵循Hackerrank 30 days of code 来学习 Clojure ,并且由于我既不理解也找不到任何文档或解释的行为而损失了几个小时:
-
(read)
返回一个符号:user=> (def key-read (read)) sam #'user/key-read user=> (type key-read) clojure.lang.Symbol
-
(read-line)
返回一个字符串user=> (def key-line (read-line)) sam #'user/key-line user=> (type key-line) java.lang.String
因此,解析一行(read) (read)
以获取映射键和值会导致键成为符号,而不会被进一步匹配(read-line)
。
为什么会这样?而且,我在哪里可以找到返回值?(这在 中没有记录(doc read)
)。
回答
TL; 博士
clojure.core/read
用于读取 Clojure 本身的“代码”clojure.edn/read
用于读取“数据”(EDN)read-line
用于将文本行读取为字符串;破译它们是你的问题
能read
为你做什么
read
不只是阅读的符号,但任何事情,那Clojure中用来表示代码。如果你给它一个符号来解析,它会给你符号:
(type (read))
test
clojure.lang.Symbol
但还有其他事情
(type (read))
5
java.lang.Long
(type (read))
{:a 42}
clojure.lang.PersistentArrayMap
(type (read))
"hello"
java.lang.String
所以你也可以取回一个字符串read
,如果你给它一个字符串。
实际使用 read
通常read
由 Clojure 本身使用,仅此而已。读取 EDN 通常使用 完成clojure.edn/read
,它不允许代码执行,因此如果处理来自不受信任来源的 EDN,则没有安全风险。
文档
为了更好地衡量,这里是文档:
(doc read)
-------------------------
clojure.core/read
([] [stream] [stream eof-error? eof-value] [stream eof-error? eof-value recursive?] [opts stream])
Reads the next object from stream, which must be an instance of
java.io.PushbackReader or some derivee. stream defaults to the
current value of *in*.
Opts is a persistent map with valid keys:
:read-cond - :allow to process reader conditionals, or
:preserve to keep all branches
:features - persistent set of feature keywords for reader conditionals
:eof - on eof, return value unless :eofthrow, then throw.
if not specified, will throw
Note that read can execute code (controlled by *read-eval*),
and as such should be used only with trusted sources.
For data structure interop use clojure.edn/read
(doc read-line)
-------------------------
clojure.core/read-line
([])
Reads the next line from stream that is the current value of *in* .