我正在使用绑定作为一种手段,以便更容易在呼叫中传递状态。我目前有类似以下的内容
(binding [*private-key-path* "/Users/dcapwell/.ssh/id_dsa"]
(binding [*session* (session "localhost")]
...
我需要这样做的原因是会话功能需要定义 private-key-path 。由于绑定不允许相关值,有没有更简单的方法来执行上述操作而不需要嵌套?
编辑:
目前正在使用clj-ssh.ssh进行原型设计。计划是将我当前使用的绑定大部分用作静态配置(大多数都是静态值,因此在启动时读取一次)。使用绑定作为一种简化原型设计的方法,因此在查看API的工作原理时,我不必继续传递内容。
我只是好奇我如何才能让绑定相互依赖。当我使用let时,第二个绑定可以访问第一个绑定,但是当我这样做时,第二个绑定似乎无法访问第一个绑定。我会假设会有另一个函数像绑定一样,但允许第二个绑定访问第一个。我也可以看到这在默认情况下不存在,因为它更多的是状态而不是其他任何东西。
答案 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”的功能。再也不用担心函数之间的依赖关系!