,公/私,默认

  • 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

    上一篇: , public/private, defaults

    下一篇: Clojure def vs defn for a function with no arguments