我想我会发布这个,因为我在没有真正了解发生了什么的情况下通过猜测来工作,我认为如果有人解释它可能会有所帮助。
我了解如何在 Compojure 处理程序中获取 :params 映射的元素:
(GET "/something" [some_arg] "this is the response body")
或者
(GET "/something" {{some_arg "some_arg"} :params} "this is the response body")
虽然我不完全理解这{some_arg "some_arg"}
部分在做什么:(
我还想访问:remote-addr
请求的部分以及some_arg
. 最后我得到了
(GET "/something" {{some_arg "some_arg"} :params ip :remote-addr}
(do-something-with some_arg ip))
因此,我得到了未加引号的字符串some_arg
,并且ip
是我希望将值绑定到的变量的名称,但上面的映射不是有效的 Clojure 映射。它是如何工作的?
我还知道这是针对 Ring 请求映射(以某种方式由defroutes
宏提供)进行评估的,但上面的表达式不是函数或宏定义,那么它如何“存在”为我的代码中的有效表达式?宏参数的正常规则是否有某种暂停?我一直无法找到这个非 Lisp'er 可以理解的解构形式的语法定义。