2010-08-30 2 views
3

Je tente d'utiliser clojure.contrib.io (1.2) append-spit pour ajouter à un fichier (allez figure).Problème avec append-spit

Si je crée un fichier texte sur mon bureau, comme un test, et tenter de joindre à elle dans un rempl frais, voici ce que je reçois:

user> (append-spit "/Users/ihodes/Desktop/test.txt" "frank") 
Backtrace: 
    0: clojure.contrib.io$assert_not_appending.invoke(io.clj:115) 
    1: clojure.contrib.io$outputstream__GT_writer.invoke(io.clj:266) 
    2: clojure.contrib.io$eval1604$fn__1616$G__1593__1621.invoke(io.clj:121) 
    3: clojure.contrib.io$fn__1660.invoke(io.clj:185) 
    4: clojure.contrib.io$eval1604$fn__1616$G__1593__1621.invoke(io.clj:121) 
    5: clojure.contrib.io$append_writer.invoke(io.clj:294) 
    6: clojure.contrib.io$append_spit.invoke(io.clj:342) 
    7: user$eval1974.invoke(NO_SOURCE_FILE:1) 
    8: clojure.lang.Compiler.eval(Compiler.java:5424) 
    9: clojure.lang.Compiler.eval(Compiler.java:5391) 
10: clojure.core$eval.invoke(core.clj:2382) 
11: swank.commands.basic$eval_region.invoke(basic.clj:47) 
12: swank.commands.basic$eval_region.invoke(basic.clj:37) 
13: swank.commands.basic$eval807$listener_eval__808.invoke(basic.clj:71) 
14: clojure.lang.Var.invoke(Var.java:365) 
15: user$eval1972.invoke(NO_SOURCE_FILE) 
16: clojure.lang.Compiler.eval(Compiler.java:5424) 
17: clojure.lang.Compiler.eval(Compiler.java:5391) 
18: clojure.core$eval.invoke(core.clj:2382) 
19: swank.core$eval_in_emacs_package.invoke(core.clj:94) 
20: swank.core$eval_for_emacs.invoke(core.clj:241) 
21: clojure.lang.Var.invoke(Var.java:373) 
22: clojure.lang.AFn.applyToHelper(AFn.java:169) 
23: clojure.lang.Var.applyTo(Var.java:482) 
24: clojure.core$apply.invoke(core.clj:540) 
25: swank.core$eval_from_control.invoke(core.clj:101) 
26: swank.core$eval_loop.invoke(core.clj:106) 
27: swank.core$spawn_repl_thread$fn__489$fn__490.invoke(core.clj:311) 
28: clojure.lang.AFn.applyToHelper(AFn.java:159) 
29: clojure.lang.AFn.applyTo(AFn.java:151) 
30: clojure.core$apply.invoke(core.clj:540) 
31: swank.core$spawn_repl_thread$fn__489.doInvoke(core.clj:308) 
32: clojure.lang.RestFn.invoke(RestFn.java:398) 
33: clojure.lang.AFn.run(AFn.java:24) 
34: java.lang.Thread.run(Thread.java:637) 

Ce qui est clairement pas ce que je voulais .

Je me demandais si quelqu'un d'autre avait ces problèmes, ou si je fais quelque chose de mal? Le fichier que je lui ajoute pas ouvert (au moins par moi). Je suis à perte.

Merci beaucoup!

Répondre

7

Je remarque que les fonctions pertinentes sont marquées comme obsolètes en 1.2, mais j'ai aussi l'impression que, comme écrit, elles ont des bugs à corriger.

Tout d'abord, d'une manière non dépréciée de faire ce que vous essayez de faire (ce qui fonctionne bien pour moi):

(require '[clojure.java.io :as io]) 

(with-open [w (io/writer (io/file "/path/to/file") 
         :append true)] 
    (spit w "Foo foo foo.\n")) 

(Skipping io/file et simplement passer la chaîne à io/writer fonctionnerait aussi - je préfèrent utiliser le wrapper en partie pour des raisons personnelles et en partie pour que c.j.io n'essaie pas de traiter la chaîne comme une URL (seulement pour reculer via une exception et opter pour un fichier dans ce cas), ce qui est son premier choix de l'interprétation.)

Quant à savoir pourquoi je pense que clojure.contrib.io pourrait souffrir ing d'un bug:

(require '[clojure.contrib.io :as cio]) 

(with-bindings {#'cio/assert-not-appending (constantly true)} 
    (cio/append-spit "/home/windfall/scratch/SO/clj/append-test.txt" "Quux quux quux?\n")) 

Cela ne se plaint pas, mais ni n'ajouter au fichier - le contenu actuel sera remplacé à la place. Je ne suis pas encore sûr de ce qu'est exactement le problème, mais passer à clojure.java.io devrait l'éviter. (Il est clair que cela nécessite une enquête plus approfondie - le code obsolète ne devrait toujours pas être bogué - Je vais essayer de le comprendre.)

+0

Je ne connaissais pas l'option: append. Cool je peux l'utiliser dans le plugin du journal de sexpbot. A besoin d'une révision de toute façon. – Rayne

+2

Oui, c'est un bug connu dans clojure-contrib 1.2: http://www.assembla.com/spaces/clojure-contrib/tickets/90. Un correctif a été proposé. La meilleure solution est d'utiliser clojure.java.io, car clojure.contrib.io est obsolète et disparaîtra avec 1.3. – bendin

+0

@bendin: Ah, bon à savoir, merci. Bon travail de triage et de réparation! @Rayne: Cool. :-) –