我花了几年的时间做“计划”,现在正在学习Clojure。 Scheme中的“最佳实践”之一是在父函数中定义辅助函数,从而限制它们从“外部”的可见性。当然,当时TDD没有完成(或者已知!)所以测试这些功能不是问题。
我仍然想以这种方式构建Clojure函数;即,使用letfn绑定主函数中的辅助函数。当然,测试这种“本地”功能是有问题的。我意识到我可以定义“私有”函数,但这会限制命名空间的可见性,这有助于,但不是那么精细。如果你在另一个函数中遇到letfn,很明显该函数不能用于一般用途。
所以,我的问题是,可以测试这样的本地功能,如果是,如何?如果没有,那么是否有一些约定来帮助代码读取,这样很明显函数只有一个调用者?
TIA, 比尔
答案 0 :(得分:1)
通常的方法是将函数放在命名空间中。
一种选择是使用元数据:
user=> (defn ^{::square #(* % %)} cube [x]
#_=> (* x ((::square (meta #'cube)) x)))
#'user/cube
user=> (meta #'cube)
{…, :user/square #<user$fn__780 user$fn__780@2e62c3f9>}
user=> (cube 3)
27
当然可以编写一个宏来使它更漂亮。