繼續閱讀《Clojure for the Brave and True》
comp
(composition):組合多個函數為一新函數;又成為memoize
:可以記住呼叫過的函數參數、結果的配對def
是如何將物件存於當前命名空間下(ns-interns *ns*)
來查看物件的所處空間(create-ns *ns*)
、(ns-name *ns*)
及整合指令 (in-ns *ns*)
refer
:將別的命名空間的全部物件引入到當前命名空間
ns-a
中使用 (clojure.cire/refer 'ns-b)
可以引入並能直接呼叫 ns-b
中的物件:only
、exclude
、rename
,可以只引入想要或把不想引入的排除clojure.core
自動 refer 到當前使用者空間 *user*
,然而在一般的使用者程式中不會,所以若要使用 refer
,也必須在前面加上 refer
所處的命名空間 clojure.core
alias
可以重命名 namespacens
這個 macrovar wrestlers = getAlligatorWrestlers();
var totalBites = 0;
var l = wrestlers.length;
for(var i = 0; i < l; i++){
totalBites += wrestlers[i].timesBitten;
}
在以上的 Javascript 中,迴圈應用到了外部變數如 totalBites
。在這個迴圈執行後,totalBites
也被修改了,用者無法存取原本的值(除非存在另一個變數中)。在 Clojure 中,無法修改任何東西。資料總是以類似「流」的方式在函數間傳遞。類似變數的方案是通過下述模式進行:處理後的新資料,被指定對應到舊的名稱(reference)。
comp
comp
可以把兩個函數合成一個(術語:composition)
(defn example [c] (func-a (func-b c)))
(def example (comp func-a func-b))
memoize
memoize
可以記住遞迴過程中的「參數-結果」,節省遞迴所需要的時間。
(defn fib [n]
(condp = n
0 0
1 1
(+ (fib (dec n)) (fib (- n 2)))))
(def m-fib
(memoize (fn [n]
(condp = n
0 1
1 1
(+ (m-fib (dec n)) (m-fib (- n 2)))))))
(time (fib 30)) ;; "Elapsed time: 269.306696 msecs"
(time (m-fib 30)) ;; "Elapsed time: 5.656127 msecs"
一個最簡的常見資料夾結構如下述:
| project.clj
| src
└ the_divine_cheese_code
├ core.clj
└ visualization
└ svg.clj
在 core.clj
中,為了生出 Java class,可能要寫:
(ns the-divine-cheese-code.core
(:require [thedivine-cheese-code.visualization.svg :as svg])
(:gen-class))
require
的目的是讓命名空間可用。refer
的目的是去除前綴而 alias
是保留前綴但改名。use
則等同於 require
+ alias
。