Clojure中匿名函数映射的构造

Clojure中匿名函数映射的构造,clojure,Clojure,我正在学习这门语言,我有一个简单的问题。为什么这样做(构造{:key“value”}): 但这并不是: (#({:key %}) "value") ArityException Wrong number of args (0) passed to: PersistentArrayMap clojure.lang.AFn.throwArity (AFn.java:429) 在Python上,后一种语法完全有效: > (lambda v: {'key': v})('value') {'ke

我正在学习这门语言,我有一个简单的问题。为什么这样做(构造
{:key“value”}
):

但这并不是:

(#({:key %}) "value")
ArityException Wrong number of args (0) passed to: PersistentArrayMap  clojure.lang.AFn.throwArity (AFn.java:429)
在Python上,后一种语法完全有效:

> (lambda v: {'key': v})('value')
{'key': 'value'}

编辑:感谢您的精彩回答,显然我需要停止将
#
等同于Python中的
lambda

{:key%}
是一个持久数组映射。在函数调用中,它位于“动词位置”。您需要某种类型的Clojure方法来避免该错误,正如您在第一个(工作)示例中所看到的。

这是
#()
阅读器的限制<代码>fn可以正常工作

user=> ((fn [x] {:key x}) "value")
{:key "value"}
请看一下文档

#(f%)
被读者扩展为
(fn[%](f%)
。同样地,
#({:key%})
被扩展为
(fn[%]({:key%})
。与之相当的python是
lambda v:{'key':v}()
,它与Clojure版本有着完全相同的问题

你要找的是与
(fn[v]{:key v})
等价的东西。如果你真的想使用
#(…)
符号,你可以使用
#(do{:key%})


顺便说一句,我个人从来没有使用过
(…)
。我认为这更难摸索(比如这个证据),而且只比一个等价的
fn
表单更紧凑。还有一个限制是
(…)
表单不能嵌套。

(fx)=(fn[](fx)):。

(\x}=(fn[](fx))=(fn)[]({x}))
有点粗糙,但是如果您想从anon返回元素fn:
#({key%})
#(哈希映射:k%)
您指的是什么限制?我从您发布的链接中看到的唯一限制是“#()表单不能嵌套。”但这不适用于这种情况……根据文件,
#(…​)将被转换为
(fn[args](…​))
.So
#({:key%})
将被转换为
(fn[x]({:key x}))
。这将导致错误,因为
{:key x}
处于函数位置,没有意义。
user=> ((fn [x] {:key x}) "value")
{:key "value"}