我的当前方法:如果我知道一个函数有bug,我会将它的一些部分复制到REPL中并进行评估,看输出是否符合预期。为了设置它,我必须定义函数的参数作为虚拟输入。这不是非常耗时,但我知道有更高效的方法。
有什么建议吗?
这个宏有帮助吗?它将let转换为一系列的defs,这样你就可以评估子表达式:
(defmacro def-let
"like let, but binds the expressions globally."
[bindings & more]
(let [let-expr (macroexpand `(let ~bindings))
names-values (partition 2 (second let-expr))
defs (map #(cons 'def %) names-values)]
(concat (list 'do) defs more)))
(swank.core/break)
def-let 的函数版本,部分功劳归于这里。
(defn def-let [aVec]
(if-not (even? (count aVec))
aVec
(let [aKey (atom "")
counter (atom 0)]
(doseq [item aVec]
(if (even? @counter)
(reset! aKey item)
(intern *ns* (symbol @aKey) (eval item)))
; (prn item)
(swap! counter inc)))))
使用方法:需要用引号引用内容,例如
(def-let '[a 1 b 2 c (atom 0)])
clojure.contrib.trace
中的dotrace
宏有何不同?它们似乎具有类似的目标/功能。 - intuited
clojure.contrib.test-is
是其中之一;如果我没记错的话还有一两个。 - intuited