为什么我们需要Clojure中的'in(require'[...]])?

追求

我看到我们不需要'和,(ns ...)因为ns是一个宏。但是,为什么我们需要“在” (require '[...])我以为Clojure的向量是避免'的一种奇特方法,但现在我在这里看到了。

我们使用(require 'clojure.string)sorequire似乎是一个函数,但是当作为参数给定时,我们不引用向量。

在此处输入图片说明

未引用的错误消息也令人困惑。

米歇尔·博肯特(Michiel Borkent)

这是因为require是作为函数而不是宏实现的,因此需要带引号的libspec。一个未加引号的libspec将像这样评估:

user=> [clojure.set :as s]
CompilerException java.lang.ClassNotFoundException: clojure.set

从而产生一个错误。

但是,ns作为宏实现,并且可以完全控制是否或何时进一步评估其参数,因此您无需引用libspec。您可以查看ns的宏扩展,看看扩展它会发生什么:

user=> (use 'clojure.pprint)
nil
user=> (pprint (macroexpand '(ns foo (:require [clojure.set :as s]))))
(do
 (clojure.core/in-ns 'foo)
 (clojure.core/with-loading-context
  (clojure.core/refer 'clojure.core)
  (clojure.core/require '[clojure.set :as s]))
 (if
  (.equals 'foo 'clojure.core)
  nil
  (do
   (clojure.core/dosync
    (clojure.core/commute
     @#'clojure.core/*loaded-libs*
     clojure.core/conj
     'foo))
   nil)))
nil

如您所见,ns只需按原样使用libspec并在传递要求之前将其引用给您,因此您不必这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章