首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解构表单和Compojure?

解构表单和Compojure?
EN

Stack Overflow用户
提问于 2010-11-04 00:19:12
回答 1查看 1.8K关注 0票数 6

我想我应该把这篇文章贴出来,因为我在没有真正理解发生了什么的情况下通过猜测来完成这篇文章,我想如果有人解释一下可能会有所帮助。

我了解如何在Compojure处理程序中获取:params映射的元素:

代码语言:javascript
复制
(GET "/something" [some_arg] "this is the response body")

代码语言:javascript
复制
(GET "/something" {{some_arg "some_arg"} :params} "this is the response body")

尽管我并不完全理解{some_arg "some_arg"}部分在做什么:(

我还想访问请求的:remote-addr部分以及some_arg。最后我得到了

代码语言:javascript
复制
(GET "/something" {{some_arg "some_arg"} :params ip :remote-addr}
    (do-something-with some_arg ip))

因此,我得到未加引号的字符串some_argip是我希望将值绑定到的变量的名称,但上面的映射不是有效的Clojure映射。它怎麽工作?

我还知道这是根据Ring request map (由defroutes宏以某种方式提供)进行计算的,但上面的表达式不是函数或宏定义,所以它如何在我的代码中作为有效表达式“存在”?宏观参数的正常规则是否有某种暂停?我一直找不到解构表单的语法的定义,这个非Lisp的人可以理解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-04 00:43:15

该映射是有效的解构映射。在任何绑定名称的地方,都可以使用解构。您可以在let中执行相同的操作,如下所示:

代码语言:javascript
复制
user=> (let [{{some-arg "some_arg"} :params ip :remote-addr} {:remote-addr "127.0.0.1" :params {"some_arg" "some_value"}}] [ip some-arg])
["127.0.0.1" "some_value"]

我写了一篇关于在命名参数上下文中进行映射解构的文章,但它在这里也适用。您可能会发现这很有用:Clojure - named arguments

有很多博客文章演示了解构,包括this one。我不确定哪一个是一个值得学习的地方。

我不想假装知道compojure在引擎盖下到底做了什么,但我假设它在let或类似于我上面演示的东西中抛出了它。GET是一个宏,所以它不必计算您传递给它的映射,这就是为什么除非它对它求值,否则不会得到错误。

代码语言:javascript
复制
user=> (defmacro blah [m])
#'user/blah
user=> (blah {a "b" c "d"})
nil
user=> (defn blah [m])
#'user/blah
user=> (blah {a "b" c "d"})
java.lang.Exception: Unable to resolve symbol: a in this context (NO_SOURCE_FILE:9)

在引擎盖下,魔术发生在地图上,它被传递给一个称为解构的函数,该函数执行解构魔术。

除了正常的宏/特殊格式foo和延迟求值之外,这里并没有什么特别的东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4089162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档