如xhh所言,ns是宏。我们用宏展开你的ns
(macroexpand-1 '(ns my-app
(:require [taoensso.carmine :as car :refer (wcar)])))
;;=>
(do (clojure.core/in-ns (quote my-app))
(clojure.core/with-loading-context
(clojure.core/refer (quote clojure.core))
(clojure.core/require
(quote [taoensso.carmine :as car :refer (wcar)]))) ;; 注意
(if (.equals (quote my-app) (quote clojure.core))
nil
(do (clojure.core/dosync
(clojure.core/commute
(clojure.core/deref (var clojure.core/*loaded-libs*))
clojure.core/conj
(quote my-app)))
nil)))
这里(quote [taoensso.carmine :as car :refer (wcar)])
和'(0 (1) (nil))
是一个道理,单独执行(0 (1) (nil))
肯定会错,但是quote之后,就会递归地quote其中每个元素,所以不会立即执行(wcar)
。此时从语义上来讲,(= '() [])
是等价的。