关于require
require只负责引入clojure库,不绑定函数到当前的ns中。
;;引入java io,并指定缩略名为io (require '[clojure.java.io :as io]) ;;使用 (io/file "Filename") ;;在ns中使用 (ns test (:require [clojure.java.io :as io]))
关于refer
将函数绑定到当前的ns中。例如
;;把trim和capitalize绑定到当前的ns中,可以直接调用这两个方法 (refer 'clojure.string :only '[capitalize trim]) ;;在ns中的写法 (ns test (:refer clojure.string :only [capitalize trim]))
关于refer-clojure
从源码可以看出,就是调用了refer
(defmacro refer-clojure "Same as (refer 'clojure.core)" {:added "1.0"} [& filters] `(clojure.core/refer '~'clojure.core ~@filters))
关于use
引入并绑定,相当于require+refer。
;;引入并绑定split方法,之后就可以直接使用了 (use '[clojure.string :only (split)]) ;;直接在当前ns中使用split (split "hello,world" #",") ;;在ns中的写法 (ns test (:use [clojure.string :only (split)]))
关于import
和require相似,不过import负责引入java库,require负责引入clojure库。
;;引入Clendar (import [java.util Calendar]) ;;使用 (Calendar/getInstance) ;;在ns中的写法 (ns test (:import [java.util Calendar]))
use在函数名称没有冲突,而且函数很常用的情况下使用比较合适。
require对于怕有名称冲突的情况下使用比较合适。
import就是用来引入java库的。
关于gen-class的片面
除了以上这些函数,ns中的gen-class也常用到,其功能就是将clojure代码编译成java class。
比如要将clojure代码打包成可执行jar包,那么指定main class就可以用上。(gen-class还有很多功能,这只是最常用的一个)
(ns test (:gen-class)) (defn -main [] (println "Hello, World!")) ;;编译之后,在shell中执行,打印hello, world! java test