gpt4 book ai didi

Clojure:从文件中提取结构失败,字符串属性包含空格

转载 作者:行者123 更新时间:2023-12-03 00:30:08 25 4
gpt4 key购买 nike

我刚刚开始使用 Clojure,我想尝试的第一件事是存储和检索结构列表,就像 Suart Halloway 的示例 here 中那样。 .

如果我使用属性字符串中不带空格的结构实例,则我的结构散列的吐出/slurp工作正常,如下所示:

(struct customer "Apple" "InfiniteLoop")

但是如果我使用这个:

(struct customer "Apple" "Infinite Loop 1")

我收到错误:

Exception in thread "main" clojure.lang.LispReader$ReaderException: java.lang.ArrayIndexOutOfBoundsException: 7 (test-storing.clj:19)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2719)
at clojure.lang.Compiler$DefExpr.eval(Compiler.java:298)
at clojure.lang.Compiler.eval(Compiler.java:4537)
at clojure.lang.Compiler.load(Compiler.java:4857)
at clojure.lang.Compiler.loadFile(Compiler.java:4824)
at clojure.main$load_script__5833.invoke(main.clj:206)
at clojure.main$init_opt__5836.invoke(main.clj:211)
at clojure.main$initialize__5846.invoke(main.clj:239)
at clojure.main$null_opt__5868.invoke(main.clj:264)
at clojure.main$legacy_script__5883.invoke(main.clj:295)
at clojure.lang.Var.invoke(Var.java:346)
at clojure.main.legacy_script(main.java:34)
at clojure.lang.Script.main(Script.java:20)
Caused by: clojure.lang.LispReader$ReaderException: java.lang.ArrayIndexOutOfBoundsException: 7
at clojure.lang.LispReader.read(LispReader.java:180)
at clojure.core$read__4168.invoke(core.clj:2083)
at clojure.core$read__4168.invoke(core.clj:2081)
at clojure.core$read__4168.invoke(core.clj:2079)
at clojure.core$read__4168.invoke(core.clj:2077)
at chap_03$load_db__54.invoke(chap_03.clj:71)
at clojure.lang.AFn.applyToHelper(AFn.java:173)
at clojure.lang.AFn.applyTo(AFn.java:164)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2714)
... 12 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 7
at clojure.lang.PersistentArrayMap$Seq.first(PersistentArrayMap.java:216)
at clojure.lang.APersistentMap.hashCode(APersistentMap.java:101)
at clojure.lang.Util.hash(Util.java:55)
at clojure.lang.PersistentHashMap.entryAt(PersistentHashMap.java:134)
at clojure.lang.PersistentHashMap.containsKey(PersistentHashMap.java:130)
at clojure.lang.APersistentSet.contains(APersistentSet.java:33)
at clojure.lang.PersistentHashSet.cons(PersistentHashSet.java:59)
at clojure.lang.PersistentHashSet.create(PersistentHashSet.java:34)
at clojure.lang.LispReader$SetReader.invoke(LispReader.java:974)
at clojure.lang.LispReader$DispatchReader.invoke(LispReader.java:540)
at clojure.lang.LispReader.read(LispReader.java:145)
... 20 more

根据结构中字段的数量,我也可能只获取字符串的一部分作为属性名称,而不是错误。例如:循环1

我使用这样的存储函数:

(defn store-customer-db [customer-db filename]
(spit filename (with-out-str (print customer-db))))

还有一个像这样的读取函数:

(defn load-db [filename]
(with-in-str (slurp filename)(read)))

从 spit 的输出文件中我可以看到打印没有给字符串提供双引号,这似乎是 slurp 的问题。正确的解决方案是什么?

我的 Clojure 版本是 1.0,贡献是几周前的快照。

最佳答案

printprintln 用于人类可读的输出。如果您想打印稍后再次读入的内容,请使用 prprn

user> (read-string (with-out-str (prn {"Apple" "Infinite Loop"})))
{"Apple" "Infinite Loop"}

鉴于:

user> (read-string (with-out-str (print {"Apple" "Infinite Loop"})))
java.lang.ArrayIndexOutOfBoundsException: 3 (NO_SOURCE_FILE:0)

它正在尝试运行此代码:

(read-string "{Apple Infinite Loop}")

有奇数个键/值。请注意各个散列键/值周围缺少引号。即使此读取有效(即,如果您恰好提供偶数个参数),它读取的也不会是充满字符串的 HashMap ,而是符号。所以你会得到不同于你输出的东西。

user> (map class (keys (read-string (with-out-str (print {"foo bar" "baz quux"})))))
(clojure.lang.Symbol clojure.lang.Symbol)

关于Clojure:从文件中提取结构失败,字符串属性包含空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/923029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com