Беда с аппенди-плевком - PullRequest
       1

Беда с аппенди-плевком

3 голосов
/ 30 августа 2010

Я пытаюсь использовать clojure.contrib.io's (1.2) append-spit для добавления в файл (рисунок).

Если я создаю текстовый файл на своем рабочем столе в качестве теста и пытаюсь добавить его в новом репле, я получаю следующее:

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)

Что явно не то, что я хотел.

Мне было интересно, были ли у кого-то еще эти проблемы или я что-то делаю неправильно? Файл, к которому я добавляю , не открытый (по крайней мере, мной). Я в недоумении.

Большое спасибо!

1 Ответ

7 голосов
/ 30 августа 2010

Я заметил, что соответствующие функции помечены как устаревшие в 1.2, но у меня также сложилось впечатление, что, как написано, у них есть некоторые ошибки, требующие устранения.

Во-первых, не осуждаемый способ сделать то, что вы пытались сделать (что мне подходит):

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

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

(Пропуск io/file и простая передача строки в io/writer тоже подойдут - я предпочитаю использовать обертку частично для личного вкуса и частично, чтобы c.j.io не пытался обработать строку как URL (в данном случае только для возврата через исключение и поиска файла), что является его первым выбором интерпретации.)

Почему я думаю, clojure.contrib.io может страдать от ошибки:

(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"))

Это не жалуется, но и не добавляет к файлу - вместо него заменяется текущее содержимое. Я еще не уверен, в чем именно проблема, но переход на clojure.java.io должен избежать этого. (Очевидно, что это требует дальнейшего изучения - устаревший код по-прежнему не должен содержать ошибок - я постараюсь выяснить это.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...