如何在绑定中使用clojure支持相关值?

时间:2014-11-27 23:14:56

标签: clojure

我正在使用绑定作为一种手段,以便更容易在呼叫中传递状态。我目前有类似以下的内容

(binding [*private-key-path*  "/Users/dcapwell/.ssh/id_dsa"]
  (binding [*session* (session "localhost")]
   ...

我需要这样做的原因是会话功能需要定义 private-key-path 。由于绑定不允许相关值,有没有更简单的方法来执行上述操作而不需要嵌套?

编辑:

目前正在使用clj-ssh.ssh进行原型设计。计划是将我当前使用的绑定大部分用作静态配置(大多数都是静态值,因此在启动时读取一次)。使用绑定作为一种简化原型设计的方法,因此在查看API的工作原理时,我不必继续传递内容。

我只是好奇我如何才能让绑定相互依赖。当我使用let时,第二个绑定可以访问第一个绑定,但是当我这样做时,第二个绑定似乎无法访问第一个绑定。我会假设会有另一个函数像绑定一样,但允许第二个绑定访问第一个。我也可以看到这在默认情况下不存在,因为它更多的是状态而不是其他任何东西。

1 个答案:

答案 0 :(得分:0)

编辑:REPL中的一些实验

(def ^:dynamic *a* "a not bound")
(def ^:dynamic *b* "b not bound")
(defn show-a! []
  *a*)
(binding [*a* 1 *b* (show-a!)] *b*) ;; => "a not bound"

(binding [*a* 1]
  (binding [*b* (show-a!)]
    *b*)) ;; => 1

我很惊讶地知道给定的代码与:

不一样
(binding [*private-key-path* "/Users/dcapwell/.ssh/id_dsa"
          *session*          (session "localhost")]
  ...)

所以Clojure在let表格案例中的括号往往少于其他Lisp,但不是binding

请一遍又一遍地考虑您的整体代码(和/或API设计?)。动态绑定很糟糕。你很快就会受苦。提示:使越来越多的代码可单元测试。

我不确定你要做什么,所以我推荐这个:

用于结构计算的称为“Graph”的功能。再也不用担心函数之间的依赖关系!

https://github.com/Prismatic/plumbing