clojure dynamic var конфликтует с for странным образом

Я использую динамическую переменную, чтобы упростить использование ssh. Однако он внезапно перестает работать в многопараметрическом for!

Итак, вот мой 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

Я действительно не уверен, что это такое. Можешь мне помочь? Спасибо!


person Valentin Golev    schedule 07.09.2014    source источник


Ответы (1)


Используйте doseq, а не for

У вас есть ленивая последовательность, которая будет оцениваться после возврата формы привязки. оценка силы дозы.

Для дальнейшего чтения:

person Timothy Pratley    schedule 07.09.2014