UP | HOME

Clojure NS

ns 类似 java 的 import 包系统。

use

使用样例:

(ns org.currylogic.damages.http.expenses)
(use 'org.danlarkin.json)
(use 'clojure.xml)

(defn import-transactions-xml-from-bank [url]
  (let [xml-document (parse url)]
    ;; more code here
(defn totals-by-day [start-date end-date]
  (let [expenses-by-day (load-totals start-date end-date)]
    (encode-to-str expenses-by-day)))

use takes all public functions from the namespace and includes them in the current namespace.

encode-to-str 和 parse 是来自于引入的外部函数,使用 use 可以获取到这些函数,但是会摸不到头脑:这些函数是在哪里定义的?

更简洁的,使用 require.

require

使用样例:

(ns org.currylogic.damages.http.expenses)
(require '(org.danlarkin [json :as json-lib]))
(require '(clojure [xml :as xml-core]))

(defn import-transactions-xml-from-bank [url]
  (let [xml-document (xml-core/parse url)]
    ;; more code here
(defn totals-by-day [start-date end-date]
  (let [expenses-by-day (load-totals start-date end-date)]
    (json-lib/encode-to-str expenses-by-day)))

这样在调用外部函数的时候,能明确知道函数来源于哪里,并且可以为外部的ns设置别名。

reload & reload-all

使用样例:

(use 'org.currylogic.damages.http.expenses :reload)
(require '(org.currylogic.damages.http [expenses :as exp]) :reload)

引入其他 ns 中的函数, 当这些函数发生改动,使用 reload 可以得到更新。(:reload can be replaced with :reload-all to reload all libraries that are used either directly or indirectly by the specified library.)

import

使用样例:

(import '(org.apache.hadoop.hbase.client HTable Scan Scanner)
        '(org.apache.hadoop.hbase.filter RegExpRowFilter StopRowFilter))

import 用于导入 java 包。

简洁的方式

(ns my-great-project.core
  "This namespace is CRAZY!"
  (:use [clojure.string :only [split join]] :reload)
  (:require clojure.stacktrace
            [clojure.test :as test])
  (:import (java.util Date GregorianCalendar)))