3

我正在查看 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),似乎是 a Prefix List,如这里的文档中记录的那样。但是,它不符合前缀列表的定义,因为

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

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

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

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

因此术语

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

不是前缀列表。那这是什么?我在:require.

4

3 回答 3

3

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

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

于 2013-05-20T16:20:46.577 回答
2

正如detb 的回答中所指出的,这(compojure handler route)是一个前缀列表 -compojure是需要的命名空间共享的公共前缀,handler并且route是子库规范。组合.是隐式的。

(:require (compojure handler route))

相当于:

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

当没有其他选项时,您可以将符号用作 libspecs,因此也可以这样编写:

(:require compojure.handler
          compojure.route)

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

于 2013-05-20T19:23:56.447 回答
1

require也是clojure中的一个函数,如果你检查那个函数的来源

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

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

于 2013-05-20T15:55:14.977 回答