何时在Clojure require中包含撇号?

6

这两者之间有什么区别:

(require '[some-package.sub as some])
(require 'example.core)

并且

(require [some-package.sub as some])
(require example.core)

什么情况下应该使用其中之一?只有带撇号的那个可以在 REPL 环境中使用。

可能是clojure require 语法的原理的重复问题 - Greg Hewgill
1个回答

8

require是一个函数(在REPL中使用(source require)进行检查)。因此,在自身的评估之前,会对其参数进行评估。

当您调用require时,符号some-package.sub(points)解析为无效内容,因此您会得到一个错误消息:“在此上下文中无法解析符号:the-symbol-that-points-to-nothing

但是,如果您引用该符号,我们可以实际评估require。因此,由于require是一个函数,需要引用形式。

现在,ns是一个宏(在REPL中使用(source ns)进行检查)。因此,在扩展之前不会评估其参数。从技术上讲,它可以使用自由符号或引用形式,但决定使用原始自由符号。(ns lalala (:require [some-package.sub :as some]))

当您使用a调用require(函数)时,您实际上会要求该变量所代表的符号。

示例:

(def a 'B)
(require a)
FileNotFoundException Could not locate B__init.c;ass or B.clj on the classpath[...]

这是因为 require 是一个函数。

希望对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接