特别使用:在clojure编程书中需要宏

时间:2013-05-20 14:39:07

标签: clojure

我正在看Emerick,Carper和Grand的“Clojure Programming”一书的第16章中的示例代码,我看到了

(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 Listrecorded in the documentation here。但是,它不符合前缀列表的定义,在

  

前缀列表包含共享前缀,后跟libspecs   从lib名称中删除共享前缀。

但书中的用法有三个符号,其中没有一个看起来像共享前缀。此外,

  

删除后   前缀,保留的名称不得包含任何句点。

书中的用法有一个剩余的名称ring.util.response,其中包含句号。

因此术语

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

不是前缀列表。那这是什么?我在:require的文档中找不到匹配项。

3 个答案:

答案 0 :(得分:3)

在这里,您需要两件事,其中一件是前缀列表,另一件是需要选项。它们是独立处理的,听起来就像是你感到困惑的地方。

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

答案 1 :(得分:2)

正如deterb的答案所述,(compojure handler route)是前缀列表 - compojure是要求的命名空间共享的公共前缀,handlerroute是儿童libspecs。合并.是隐含的。

(:require (compojure handler route))

相当于:

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

当没有其他选项时,你可以使用符号作为libspecs,所以也可以这样写:

(:require compojure.handler
          compojure.route)

但是当需要多个名称空间时,我发现使用所有向量而不是向量和符号的混合使其更具可读性。

答案 2 :(得分:1)

如果检查该函数的来源,

require也是clojure中的函数

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

因此,require将采用任意数量的libspecs,例如我们刚才看到的带引号的符号和向量。您还可以使用向量混合和匹配符号。这里要记住的主要事情是libspec应该是带引号的符号或向量。所以每当你想使用像:as这样的东西时,那个东西(libspec)应该是一个向量。