2014-01-07 60 views
0

我正在尋找一種方法來將我的幫助程序函數保留在文件底部,而無需將它們全部聲明在頂部。使用clojure自動聲明幫助程序函數

一個解決方案應該是編寫一個「declare-helpers」函數,通過在當前文件中通過defn-macro創建所有函數的名稱並將其包裝在一個聲明調用中。

這裏我問的是更好的方法來抓住這些名字。

*編輯*

我知道這是不好的做法,但是,下面的代碼似乎做我想做

注意,它僅適用於助手的功能與「dehfn」宏觀

定義
;define helper function 
(defmacro dehfn [name & body] 
    `(defn- ~name [email protected])) 

(defmacro declare-helpers [] 
    `(declare [email protected](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)) 
+1

你爲什麼要這麼做?在底部使用的頂部寫入功能對於可讀性來說是一個直接的勝利。畢竟,人們仍然從上到下閱讀代碼。僅僅因爲函數不暴露API或不公開ns,它們並非不那麼重要,甚至可能更重要,因爲它們是讀者在打開源文件時感興趣的重要部分。 –

回答

6

這是不可能的。沒有一個宏可以知道文件後面寫的代碼比宏調用更好,因爲沒有變量可供檢查。只是練習閱讀文件「顛倒」:Clojure不是唯一的公共語言和/或重要內容經常處於底部的語言。

+0

假設大多數解釋型語言具有相似的結構(底部是重要的東西)是否安全? – Chiron

+0

這也與數學博覽會的順序相同 - 引證出現在證明之前。 –

+0

我不能只將當前文件作爲字符串形式在「聲明助手」宏或函數中獲取,然後用正則表達式獲取名稱? – szymanowski