English 中文(简体)
线串宏 - > 具有匿名函数
原标题:threading macro -> with anonymous functions

我理解“ & gt; Theadding 宏”在 Clojure 中应用了为给定论点提供的所有功能。 但是,它似乎没有使用匿名功能。 例如 :

user> (-> 4 inc inc dec)
5

但是:

user> (-> 4 #(+ % 1) #(- % 1) #(+ % 1))

返回错误:

clojure.lang.Symbol cannot be cast to clojure.lang.IPersistentVector
[Thrown class java.lang.ClassCastException]

如果有人知道怎么绕圈子 会有帮助的 谢谢!

最佳回答

您可以在 Clojure 宏中设置匿名函数。 您遇到问题, 因为缺少一些括号 。 : () 您的例子编辑如下 。

(-> 4 (#(+ % 1)) (#(- % 1)) (#(+ % 1)))
问题回答

(这是基于"https://stackoverflow.com/a/10757945/181772">对我在评论中提出的问题的回答)。

-gt; 宏观将每个参数都取而代之, 必要时将它编成一个列表( 将“ raw” 函数应用到无参数 - 将 < code> myfunc 转换为 < code> (myfunc) ), 然后将第一个参数插入到 < code>- gt; 中, 作为每个列表中的第二个参数 。

所以 (- & gt; foo myfunc) 变成 (- & gt; foo (myfunc)) 大致上成为 (myfunc foo) (myfunc fo) 。

这在docs (-> ) 的docs中都有描述。

匿名函数的问题在于,它们是由以下读者宏生成的: 描述在这里(croll down) 。 这意味着 被转换为 ( before normal 宏扩展) (fn [...]...) 。 这很好,但归根结底, 已经是一个列表

因此宏认为匿名函数已经应用, 当它事实上遇到函数定义( 两者都是列表) 时, 并且添加“ extra” 仆人―― 如上文在另一答案中所描述的那样 - 将匿名函数应用到任何参数 。

这种不直观行为的原因是, -> 宏所使用的 dwim (do- what-i- meant, not dwim-wit-wited, 尽管...), 添加了 -> 宏, 允许您提供“ bare” 函数, 而不是要求您在列表中附加这些函数, 而不是要求您将其应用到没有参数的参数中, 是 < em> justit a hyuristical - 它只是对列表的测试 - 并且被读者宏创建的函数定义所混淆 。

[在我不好的意见中,-gt;没有很好地执行,应该拒绝所有“bare”功能,而只接受功能应用程序;这样就显得更加一致。如果不是,那么至少医生可以更清楚,解释将东西放入清单背后的动机mantics 。 ]

你的具体案件本可以简单地使用下列手段解决:

(-> 4 (+ 1) (- 1) (+ 1))

当线条第一宏 - gt; 处理将前一步的结果插入为“ 当前”函数中的第一个参数时。

造成混乱的原因是, -gt; 不是一个函数,而是一个宏,而且本案对论据的处理与其他答复所解释的非常不同。

任何名函数由阅读器宏处理, 并产生 fn* 格式。 fn* 格式是一个符号列表。 然后将符号列表输入“- gt;” 线索宏。 “- & gt;” 线索 macccro 不知道该 fn* 列表在变形之前是否应该被评估, 或者在变形之前需要先将运算符组合为fn* 列表。 然后, 运算符的窗体被折断 。





相关问题
Multiple Where clauses in Lambda expressions

I have a simple lambda expression that goes something like this: x=> x.Lists.Include(l => l.Title).Where(l=>l.Title != String.Empty) Now, if I want to add one more where clause to the ...

Lambda Expressions and Event Subscriptions

I ve heard that if lambda expressions are used to subscribe to an event, then this creates a weak reference to the event handler code, so it is not required to explicitly unsubscribe from the event ...

Weak event handler model for use with lambdas

OK, so this is more of an answer than a question, but after asking this question, and pulling together the various bits from Dustin Campbell, Egor, and also one last tip from the IObservable/Rx/...

Is there a way to specify an "empty" C# lambda expression?

I d like to declare an "empty" lambda expression that does, well, nothing. Is there a way to do something like this without needing the DoNothing() method? public MyViewModel() { SomeMenuCommand =...

C# Lambda expression -Help

I am learning lambda expression and delegates.While i try to execute the following ,I am getting error at the line which is marked bold line. (Error : Operator += cannot be applied to operands of ...

LINQ to append to a StringBuilder from a String[]

I ve got a String array that I m wanting to add to a string builder by way of LINQ. What I m basically trying to say is "For each item in this array, append a line to this StringBuilder". I can do ...