2012-05-30 42 views
16

我很难理解(因此记住)这里描述的clojure require语法:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require。看起来这两种情况都是违反直觉和不一致的。clojure需要语法理由

例如,在下文中为何需要这种载体被引用:

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

计数器直观的,因为通常矢量不Clojure中引述(列表被引用和载体被视为数据)。

和不均匀的,因为在这种情况下,载体不带引号:

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

我意识到,需要功能和NS宏内部的:require使用率只有光学相似,但仍。

有古怪的其他作品还有,比如我可以这样做:

(require '(clj-json.core)) 

但我不能这样做:

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

有人能回答这些问题:

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

我想知道是否有原因,他们是事情的方式,或者如果不一致,只是没有注意到在设计时间。

+0

退房[该线程](https://groups.google.com/forum/?fromgroups#!searchin/clojure-dev/ns$20macro/clojure-dev/6EEfdPhrWgk/qJALczHTzpkJ)上的Clojure -dev列表,如果你还没有看到它。我发现它很有用。 – Jeremy

回答

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

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

这可能与你不直观,但引用矢量(或地图或集合)没有任何问题。我经常在迅速在REPL测试的东西,而不想在地图或矢量每个关键字输入:,例如:

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

而不是:

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

的如果我只想快速获取某些数据以测试某些内容,则首先输入的速度要快得多。

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

宏不评价他们的论据,这些人都有点懒比普通函数调用,因此(clj-json.corejson)不需要的符号被引用,以防止评价。

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

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

啊,我看了一下require的文档后发现。还有另一种表单支持:

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

(require '(clojure zip [set :as s])) 
+3

好吧,所以我刚刚意识到(在你的解释后)'(需要['clj-json.core:as'json])'工作(不加引号的向量),但需要引用两次而不是一次(可能为什么引用的向量是首选) 。这个世界只需要有意义,然后我可以接受它。 – Kevin

+0

是的,我实际上正在编辑或评论这个例子,认为它可能有帮助。是不是有意义? – spacemanaki

+0

最后一个例子为什么不允许'(require'(clj-json.core:as json))'?我认为允许这会使一些其他接受的形式模糊或什么... – Kevin