【问题标题】:auto declare helpers functions with clojure使用 clojure 自动声明辅助函数
【发布时间】:2014-01-08 15:58:09
【问题描述】:

我正在寻找一种方法来将我的辅助函数保留在文件的底部,而不是将它们全部声明在顶部。

一种解决方案应该是编写一个“declare-helpers”函数,该函数获取当前文件中通过 defn- 宏创建的所有函数的名称,并将它们包装在一个声明调用中。

我在这里询问获取这些名称的更好方法。

* 编辑 *

我知道这是不好的做法,但是下面的代码似乎可以满足我的要求

请注意,它仅适用于使用“dehfn”宏定义的辅助函数

;define helper function
(defmacro dehfn [name & body]
  `(defn- ~name ~@body))

(defmacro declare-helpers []
  `(declare ~@(map symbol 
                   (re-seq #"(?<=dehfn\s)[a-zA-Z+!\-_?0-9*~#@''`/.$=]*(?=\s)" 
                           (slurp (str "src/" *file*))))))

现在你可以这样做了:

(declare-helpers)

(defn hello-user [name] (greet name))

(dehfn greet [name] (str "Hello my dear " name))

【问题讨论】:

  • 你为什么要这样做?在顶部编写函数在底部使用是可读性的直接胜利。毕竟,人们仍然从上到下阅读代码。仅仅因为函数不是 API 公开或不是 ns 的公共函数,它们的重要性并不低,甚至可能更重要,因为它们是读者打开源文件时感兴趣的重要部分。

标签: clojure


【解决方案1】:

这是不可能的。没有宏可以知道比宏调用更晚在文件中编写的代码,因为它还没有要检查的变量。只需练习“倒置”阅读文件:Clojure 并不是唯一一种公共和/或重要内容通常位于底部的语言。

【讨论】:

  • 是否可以假设大多数解释语言具有相似的结构(重要的东西在底部)?
  • 这也与数学阐述的顺序相同 - 引理在证明之前。
  • 我不能在“declare helpers”宏或函数中以字符串形式获取当前文件,然后使用正则表达式获取名称吗?
  • 那么您将遇到两个问题...您可以将整个文件内容包装在一个宏中并遍历源代码,但不要这样做。您可以在每次编辑文件时使用 emacs 进行操作,但不要这样做。
  • 好吧,我明白了,我只是好奇,我从一开始就知道这听起来很脏。
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多