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"}