2013-05-20 37 views
3

我看着書「的Clojure編程」由Emerick,卡珀和大的第16章的示例代碼中,我看到的特定用途:需要用Clojure編程的書宏觀

(ns com.clojurebook.url-shortener 
    (:use [compojure.core :only (GET PUT POST defroutes)]) 
    (:require (compojure handler route) 
      [ring.util.response :as response])) 

我在心理上解析:require條款時遇到了一些麻煩,並希望得到一些幫助。條款中的第一種形式,即(compojure handler route),將顯示爲Prefix List,如recorded in the documentation here。然而,它並不適合前綴列表的定義,在

前綴列表包含共享前綴之後libspecs 從LIB名字刪除共享前綴。

但書中的用法有三個符號,其中沒有一個看起來像共享前綴。此外,

刪除 前綴後,保留的名稱不能包含任何句點。

本書中的用法有一個剩餘名稱ring.util.response,其中包含句點。

因此術語

(:require (compojure handler route) 
      [ring.util.response :as response]) 

不是一個前綴列表。那這是什麼?我在:require的文檔中找不到匹配項。

回答

2

正如deterb的回答指出,該(compojure handler route)是一個前綴列表 - compojure是由命名空間分享給需要的常見的前綴,handlerroute是孩子libspecs。暗含合併.

(:require (compojure handler route)) 

等同於:

(:require [compojure.handler] 
      [compojure.route]) 

您可以使用符號libspecs時,有沒有其他選項,讓也可以寫成:

(:require compojure.handler 
      compojure.route) 

,但需要多個命名空間時,我發現使用所有矢量而不是矢量和符號的組合更具可讀性。

1

require也是Clojure的一個功能,如果你檢查功能

(defn require[& args] 
    (apply load-libs :require args)) 

這樣的來源,require將採取libspecs,如引用符號和載體,我們剛纔看到任意數量的。您還可以將符號與矢量混合匹配。這裏要記住的主要事情是libspec應該是帶引號的符號或向量。因此,無論何時您想使用:as之類的東西,該東西(libspec)都應該是一個向量。

3

在這裏,你需要兩件事情,其中​​之一是一個前綴列表,另一個是需要選項。他們是獨立處理的,這聽起來像是你感到困惑的地方。

第一部分(compojure handler route),是一個前綴列表。第二部分[ring.util.response :as response],是一個正常的libspec,而不是一個前綴列表。您可以根據需要添加其他前綴列表和libspecs。