为什么当`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* .


以上是为什么当`read-line`返回一个字符串时`read`返回一个符号的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>