,公/私,默认
defn
= public defn-
=私人 也许我有不好的Clojure编码风格 - 但我发现我在Clojure中编写的大多数函数都是我不想公开的小帮助函数。
是否有一些配置选项,其中:
defn
=默认为private, defn+
? 谢谢!
不,那里没有。
另一种可能或可能不适用于您的方法是声明foo.bar.internal
命名空间,其中包含您的foo.bar
命名空间使用的所有专用助手。 当您想在宏扩展中使用私有函数时,这比私有函数声明具有优势。
正如@kotarak所说,根据我所知,没有办法做到这一点,也不可取。
这就是为什么我不喜欢defn-
:
我发现当使用各种Clojure库时,我有时需要稍微修改一个函数以更好地满足我的特定需求。 它通常是相当小的,只有在我的特殊情况下才有意义。 通常这只是一个字符或两个字符。
但是,当这个函数重用内部私有函数时,它使修改变得更加困难。 我必须复制粘贴所有这些私人功能。
我明白,这是程序员说“这可能会改变,恕不另行通知”。
无论如何,我想要相反的惯例:
defn
,这使得一切都公开 defn+
(尚不存在)向程序员指定哪些函数是他应该使用的公共API的一部分。 defn+
应该与defn
没有区别。 另请注意,无论如何都可以访问私人功能:
;; in namespace user
user> (defn- secret []
"TOP SECRET")
;; from another namespace
(#'user/secret) ;;=> "TOP SECRET"
Clojure作为一个Lisp的美妙之处在于,您可以构建和调整语言以适应您的需求。 我强烈建议你阅读Paul Graham的On Lisp。 他现在免费送走他的书。
关于你的defn + vs defn vs defn-的建议。 对我来说,这听起来像是编写自己的宏的好例子。 defn
是一个函数,并且defn-
一个宏。 您可以根据需要重新定义它们,或者将它们自行包装。
这里主要是基于Clojure自己的实现 - 包括一个简单的实用程序和一个测试。
(defmacro defn+
"same as Clojure's defn, yielding public def"
[name & decls]
(list* `defn (with-meta name (assoc (meta name) :public true)) decls))
(defmacro defn
"same as Clojure's defn-, yielding non-public def"
[name & decls]
(list* `defn (with-meta name (assoc (meta name) :private true)) decls))
(defn mac1
"same as `macroexpand-1`"
[form]
(. clojure.lang.Compiler (macroexpand1 form)))
(let [ ex1 (mac1 '(defn f1 [] (println "Hello me.")))
ex2 (mac1 '(defn+ f2 [] (println "Hello World!"))) ]
(defn f1 [] (println "Hello me."))
(defn+ f2 [] (println "Hello World!"))
(prn ex1) (prn (meta #'f1)) (f1)
(prn ex2) (prn (meta #'f2)) (f2) )
链接地址: http://www.djcxy.com/p/82567.html