2012-05-30 51 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