Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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 无法了解(状态/禁止!)的工作原理_Clojure_Ring - Fatal编程技术网

Clojure 无法了解(状态/禁止!)的工作原理

Clojure 无法了解(状态/禁止!)的工作原理,clojure,ring,Clojure,Ring,我可以阅读Ring文档,知道(status/probled!)会引发一个异常,返回HTTP 403 (ns com.example.mosaic.endpoint.v2.api (:require ; ... [ring.util.http-response :as status] [ring.util.response :as response]) (:import [org.joda.time DateTime])) (defn- check-error-r

我可以阅读Ring文档,知道(status/probled!)会引发一个异常,返回HTTP 403

(ns com.example.mosaic.endpoint.v2.api
  (:require
    ; ...
    [ring.util.http-response :as status]
    [ring.util.response :as response])
  (:import [org.joda.time DateTime]))

(defn- check-error-response!
  "Translate the response from boundary server into an appropriate http error response."
  [response user-id field-id]
  (let [{:keys [status]} response]
    (cond
      (contains? #{401 403 404} status) (status/forbidden! {:error-code "BS-004" :user-id user-id :field-id field-id })
      (= 500 status) (status/internal-server-error! {:error-code "BS-005" :user-id user-id :field-id field-id }))))
问题是,我不明白它是怎么做到的。我查看了铃声代码,但在任何地方都找不到(状态/禁止!)的def。我确实看到了

(defstatus Forbidden 403 "Forbidden" "The request was a legal request but the server is refusing to respond to it.")
…在中,但没有“!”在它上面,禁止和禁止在任何情况下都不一样。允许这段代码编译和工作涉及到什么魔法?请解释一下

project.clj:依赖项是

:dependencies
  [[org.clojure/clojure "1.6.0"]
   [org.clojure/tools.cli "0.3.1"]
   [org.clojure/tools.logging "0.3.0"]
   [ring/ring-core "1.3.0"]
   [ring/ring-jetty-adapter "1.3.0"]
   [metosin/ring-swagger-ui "2.0.24"]
   [metosin/ring-swagger "0.14.0"]
   [metosin/compojure-api "0.15.1"]
   [org.slf4j/slf4j-api "1.6.2"]
   [org.slf4j/slf4j-log4j12 "1.6.2"]
   [bk/ring-gzip "0.1.1"]
   [com.example/field-layer "2015.04.17T16.17.30.874cd09"]
   [com.cemerick/drawbridge "0.0.6"]
   [clj-http "1.1.0"]
   [com.example.the-request/the-clj-http "2015.04.15T00.53.11.843c71c"]
   [org.apache.httpcomponents/httpclient "4.3.6"]
   [com.example/compojure-api-utils "2015.03.30T23.14.19.79ff61f"]
   [ring.middleware.logger "0.5.0" :exclusions [org.slf4j/slf4j-log4j12]]
   [ring.middleware.conditional "0.1.0"]
   [com.example/the-config "2014.11.07T23.39.35.5844ff4"]
   [com.example.the-request/the-request-core "2015.04.23T22.02.36.e4ca089"]
   [com.example/the-ring-middleware "2014.11.07T23.39.49.0d0d85d"]]
“魔力”在
defstatus
宏中:

(defmacro defstatus [class-name status name description & [options]]
见第29行和第45行:

(let [...
      fn-name (->kebab-case class-name)
      ...

`(defn ~(symbol (str fn-name "!"))
    ...
因此
(禁用defstatus…
扩展为
(禁用defn!…)

通过执行以下命令,可以看到完整的宏展开:

(macroexpand-1 '(defstatus Forbidden 403 "Forbidden" "The request was a legal request but the server is refusing to respond to it."))
在ring.util.http-response命名空间中

禁止使用类名称

(->烤肉串盒禁止)=>禁止

(str禁止“!”=>“禁止!”

(defn~(symbol“fobidden!”)…)=>(defn禁止!…)


宏扩展为代码。。。在本例中,代码将定义一个与第一个参数名称类似的函数,但采用驼峰大小写,并带有尾随bang。

除了ring之外,您还使用其他库吗?请共享project.clj中的
:依赖项
。您可以链接您正在查看的代码吗?我在@ez121sl中找不到defstatus:添加到问题的依赖项。“我想是中环,”蒂莫西普拉特利·吉图布·林克补充道,“哦,天哪。”。那是魔法。很好的解释。