在Clojure REPL中使用long let表达式

时间:2015-01-07 14:53:40

标签: clojure

我经常遇到这种情况,并想知道是否有一个简单的解决方案。假设我有一个Clojure源文件,其中包含let表达式,如下所示:

(let [a (...)
      b (...)
      c (...)
      d (...)
      e (...)
      f (...)
      g (...)
      h (...)] 
  (...))

其中每个值都取决于上面的一些值。

然后当我想手动处理在REPL中定义h的表达式时(假设至少有一个输入是一些巨大的地图JSON响应或者更令人痛苦的事情)手动输入,然后我发现自己手动做

(def a (...))
(def b (...))
(def c (...))
(def d (...))
(def e (...))
(def f (...))
(def g (...))

在我开始尝试弄乱h之前。

通常这意味着在REPL中输入(def ),然后移动我的鼠标,从a (...)表达式复制let,粘贴回(def )然后点击输入,然后回去为b做同样的事情,依此类推。

有更快的方法吗?

2 个答案:

答案 0 :(得分:2)

您还可以编写一个宏,该宏接受let形式的绑定并将其转换为def形式的序列。

(defmacro letdef [bindings]
  (apply list `do (for [[s expr] (partition-all 2 bindings)]
                    `(def ~s ~expr))))

(letdef [a 1
         b 2
         c 3
         etc (+ a b c)])

(println etc) ;=> 6

答案 1 :(得分:1)

这是一个可能适合你的黑客攻击:

(let [a (...)
      b (...)
      c (...)
      d (...)
      e (...)
      f (...)
      g (...)
      h (...)
      _ (def h' h)] 
  (...))

显然你永远不会想要在代码中检查这样的东西,但是为了在REPL中破解它可能就足够了。