Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure编程书中:require宏的特殊用法_Clojure - Fatal编程技术网

clojure编程书中:require宏的特殊用法

clojure编程书中:require宏的特殊用法,clojure,Clojure,我正在看Emerick、Carper和Grand在《Clojure编程》一书第16章中的示例代码,我明白了 (ns com.clojurebook.url-shortener (:use [compojure.core :only (GET PUT POST defroutes)]) (:require (compojure handler route) [ring.util.response :as response])) 我在分析:require子句时遇到了

我正在看Emerick、Carper和Grand在《Clojure编程》一书第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)
,似乎是
前缀列表,如下所示。但是,它不符合前缀列表的定义,因为

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

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

在移除 前缀,保留的名称不得包含任何句点

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

因此,这个术语

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

不是前缀列表。那是什么?我在文档中找不到与
:require

require
在clojure中也是一个函数的匹配项,如果您检查该函数的源代码

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

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

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


第一部分是前缀列表。第二部分是一个普通的libspec,而不是前缀列表。您可以根据需要添加其他前缀列表和libspec。

如deterb的回答中所述,
(compojure处理程序路由)
是前缀列表-
compojure
是名称空间所需的公共前缀,
处理程序
路由
是子libspec。组合
是隐式的

(:require (compojure handler route))
相当于:

(:require [compojure.handler]
          [compojure.route])
当没有其他选项时,可以将符号用作libspec,因此也可以写入:

(:require compojure.handler
          compojure.route)
但当需要多个名称空间时,我发现使用所有向量比混合使用向量和符号更具可读性