【发布时间】:2016-10-04 17:01:51
【问题描述】:
我正在学习 Elixir,目前正在处理捕获的语义和函数的部分应用。
我已经熟悉fn(x)-> x + 1 end 语法。
我注意到我认为令人惊讶的行为。例如,我观察到这个 sn-p 中的最后一个表达式返回 false:
f = &(&1 <> "-X")
# #Function<6.50752066/1 in :erl_eval.expr/5>
is_function f
# true
is_function &(&1 <> "-X")
# true
f == &(&1 <> "-X")
# false
我将其解释为动态“重新创建”匿名函数&(&1 <> "-X") 返回的值不等于存储在f 中的值(根据== 语义)。
那很好,另一个 sn-p 将证实我的理论:
g = &(String.upcase(&1))
# &String.upcase/1
is_function g
# true
is_function &(String.upcase(&1))
# true
g == &(String.upcase(&1))
# true
在那里,g 将等于重新创建的匿名函数,因为——也许——捕获现有的命名函数已被编译器优化,并且每次都返回相同的值。第二个 sn-p 中第一行的返回值似乎证实了两种情况不同处理的想法。
然后我尝试使用“已知”功能,这意味着它已经存在:
f = &(&1 <> "-X")
z = &(f.(&1))
#Function<6.50752066/1 in :erl_eval.expr/5>
z == &(f.(&1))
# false
最后一句话又是假的。
我本来希望&(f.(&1)) 以与&(String.upcase(&1)) 类似的方式处理,因为两者都已经存在。
那么,函数捕获的语义是什么?
【问题讨论】:
标签: elixir