18

我很难理解(因此记住)这里描述的 clojure require 语法:http: //clojuredocs.org/clojure_core/1.3.0/clojure.core/require。这似乎既违反直觉又不统一。

例如,在下面为什么需要引用这个向量:

(require '[clj-json.core :as json])

反直觉,因为通常在 clojure 中不引用向量(引用列表并将向量视为数据)。

并且不统一,因为在这种情况下,向量没有被引用:

(ns xxx 
    (:require [clj-json.core :as json]))

我意识到 require 函数和:requirens 宏内部的用法只是在光学上相似,但仍然如此。

还有其他一些奇怪的东西,例如我可以这样做:

(require '(clj-json.core))

但我不能这样做:

(require '(clj-json.core :as json))

有人可以回答这些问题:

  1. 在第一个示例中,为什么需要引用向量?
  2. 为什么不需要在ns宏中引用?
  3. 为什么列表符号不允许:as

我想知道为什么事情是这样的,或者是否在设计时没有注意到不一致。

4

1 回答 1

11
  1. 在第一个示例中,为什么需要引用向量?

require是一个函数,所以你必须引用它们以防止评估。否则,将在当前上下文中查找这些符号,可能会导致错误或可能出现意外行为。顺便说一句,我认为这不太正确:“反直觉,因为通常在 clojure 中不引用向量(引用列表并且将向量视为数据)。”

这对您来说可能与直觉相反,但是引用向量(或地图或集合)并没有错。我经常在 REPL 上快速测试某些东西,并且不想:为 map 或 vector 中的每个关键字键入 a,例如:

user=> '{a 1 b 2 c 3}

而不是:

user=> {:a 1 :b 2 :c 3}

如果我只是想快速获取一些数据来测试某些东西,第一个输入速度会非常快。

  1. 为什么不需要在ns宏中引用?

宏不评估它们的参数,它们比普通函数调用更懒惰,因此不需要引用符号 (clj-json.core和) 来防止评估。json

  1. 为什么列表符号不允许:as?

对不起,我不知道这个问题的答案。

啊,我看了一下文档require,发现了。支持另一种形式:

“以下将加载库 clojure.zip 和 clojure.set 缩写为 's'。”

(require '(clojure zip [set :as s]))
于 2012-05-30T16:00:08.627 回答