我正在看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 List
,recorded in the documentation here。但是,它不符合前缀列表的定义,在
前缀列表包含共享前缀,后跟libspecs 从lib名称中删除共享前缀。
但书中的用法有三个符号,其中没有一个看起来像共享前缀。此外,
删除后 前缀,保留的名称不得包含任何句点。
书中的用法有一个剩余的名称ring.util.response
,其中包含句号。
因此术语
(:require (compojure handler route)
[ring.util.response :as response])
不是前缀列表。那这是什么?我在:require
的文档中找不到匹配项。
答案 0 :(得分:3)
在这里,您需要两件事,其中一件是前缀列表,另一件是需要选项。它们是独立处理的,听起来就像是你感到困惑的地方。
第一部分(compojure handler route)
是前缀列表。第二部分[ring.util.response :as response]
是正常的libspec,而不是前缀列表。您可以根据需要添加其他前缀列表和libspec。
答案 1 :(得分:2)
正如deterb的答案所述,(compojure handler route)
是前缀列表 - compojure
是要求的命名空间共享的公共前缀,handler
和route
是儿童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)应该是一个向量。