我经常遇到这种情况,并想知道是否有一个简单的解决方案。假设我有一个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
做同样的事情,依此类推。
有更快的方法吗?
答案 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中破解它可能就足够了。