代码之家  ›  专栏  ›  技术社区  ›  Isaac

吐口水有问题

  •  3
  • Isaac  · 技术社区  · 16 年前

    我正在尝试使用克洛jure.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 回复  |  直到 16 年前
        1
  •  8
  •   Michał Marczyk    16 年前

    我注意到相关函数在1.2中被标记为已弃用,但我也有这样的印象:正如所写的那样,它们有一些bug需要解决。

    首先,一种不受欢迎的方式来做你想做的事情(这对我来说很好):

    (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 应该避免。(显然,这需要进一步的调查——不推荐使用的代码仍然不应该有bug——我会努力找出原因。)

    推荐文章