2009-05-28 9 views
7

Clojureを使い始めたばかりです。Suart Hallowayの例のように、構造体のリストを格納して取得しようとすると最初に試してみたものが最初です。hereClojure:ファイルからslurping構造体が空白文字列を含んだ文字列属性で失敗する

私は、次のような属性文字列にスペースを入れずに構造体のインスタンスを使用する場合、構造体のハッシュの私の唾/ 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 

、私は可能性がありますまた、エラーの代わりに属性名として文字列の一部を取得するだけです。例えば:私がいることがわかりますつばの出力ファイルから

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

:このような

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

および読取り機能:ループ1

私はこのようなストア機能を使用します文字列に二重引用符を付けることはありませんが、これはスラップの問題です。これに対して正しい解決策は何でしょうか?

マイClojureのバージョンは1.0で、contribのは数週間の古いスナップショットです。

+0

#clojure(irc)で信頼性の高い即時回答が得られる可能性があります。 – alphazero

答えて

10

printprintlnは、人間が読み取り可能な出力のためのものです。あとで読むために何かを印刷したい場合は、prまたはprnを使ってください。

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

に対し:キー/値の奇数を持って

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

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

それはこのコードを実行しようとしています。個々のハッシュキー/値の前後に引用符がないことに注意してください。この読み込みが機能しても(つまり、偶数のパラメータを偶然に提供しても)読み込まれる内容は、文字列ではなく、シンボルであるハッシュマップになります。だから、あなたが出すもの以外の何かを取り戻すでしょう。

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

は、言う:

(def hashed-hobbits {:bilbo "Takes after his Mother's family" :frodo "ring bearer"}) 

は、あなただけの必要があります。

(spit "hobbitses.txt" hashed-hobbits) 

、それをリードバックする:

(def there-and-back-again (read-string (slurp "hobbitses.txt"))) 

唾/吸い込みがでそれをすべてラップstringを読み込みますが、slurpでread-stringを使用すると、文字列がclに戻されますojureコード/データ。 trollishデータ構造でも動作します!

+0

これは素晴らしいです、ありがとう – scape

関連する問題