【问题标题】:clojure dynamic var conflicts with for in a weird wayclojure 动态 var 以一种奇怪的方式与 for 冲突
【发布时间】:2014-10-31 18:05:01
【问题描述】:

我使用动态 var 来简化使用 ssh 的方法。但是,它突然停止工作在一个多参数!

所以,这是我的core.clj(现在有点粗略):

(use 'clj-ssh.ssh)

(def the-agent (ssh-agent {}))

(def ^:dynamic *session* nil)

(defmacro on-host [host & body]
  `(binding [*session* (clj-ssh.ssh/session the-agent ~host {})]
    ~@body))

(defn cmd [& args]
  (split (:out (ssh *session* {:cmd (join " " args)})) #"\n"))

(defn attempt-1 []
  (cmd "ls -a"))
(defn attempt-2 []
  (for [f (cmd "ls -a")]
    f))
(defn attempt-3 []
  (for [r (range 3)
        f (cmd "ls -a")]
    [r f]))

由于某种原因,前两个试用功能有效,第三个无效(主机和文件受到谴责):

user=> (on-host "(some host)" (attempt-1))
["." ".." ".ackrc" ...]

user=> (on-host "(some host)" (attempt-2))
("." ".." ".ackrc" ...)

user=> (on-host "(some host)" (attempt-3))

IllegalArgumentException No implementation of method: :connected? of protocol: #'clj-ssh.ssh.protocols/Session found for class: nil  clojure.core/-cache-protocol-fn (core_deftype.clj:544)

以防万一您需要堆栈跟踪:

user=> (use 'clojure.stacktrace)    
nil
user=>  (print-stack-trace *e 7)
java.lang.IllegalArgumentException: No implementation of method: :connected? of protocol: #'clj-ssh.ssh.protocols/Session found for class: nil
 at clojure.core$_cache_protocol_fn.invoke (core_deftype.clj:544)
    clj_ssh.ssh.protocols$eval1554$fn__1566$G__1543__1571.invoke (protocols.clj:4)
    clj_ssh.ssh$connected_QMARK_.invoke (ssh.clj:411)
    clj_ssh.ssh$ssh.invoke (ssh.clj:712)
    census.core$cmd.doInvoke (core.clj:15)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    census.core$attempt_3$iter__1949__1955$fn__1956.invoke (core.clj:29)
nil

我真的不确定这到底是怎么回事。你能帮助我吗?谢谢!

【问题讨论】:

    标签: clojure dynamic-binding


    【解决方案1】:

    使用doseq,而不是for

    您所拥有的是一个惰性序列,它将在绑定表单返回后进行评估。 doseq 力评估。

    进一步阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多