如何用变量调用Erlang函数?

时间:2015-06-20 21:16:39

标签: erlang

4> abs(1).
1
5> X = abs.
abs
6> X(1).
** exception error: bad function abs
7> erlang:X(1).
1
8>

当我使用变量调用函数时,是否有任何特殊原因需要使用模块名称?这对我来说不起作用,因为,有一件事,它只是太多的语法垃圾,让我的眼睛流血。另一方面,我打算从列表中调用函数,例如(在我的脑海中):

[X(1) || X <- [abs, f1, f2, f3...]].

尝试在这里使用各种模块名称将会使详细程度达到顶峰,而我所做的全部工作都是为了减少冗长。

编辑:看这里:http://www.erlangpatterns.org/chain.html这家伙已经取得了一些管道功能。他按照我想要的方式调用函数,但是当我尝试使用它时,他的代码不起作用。但据我所知,这个人是一位经验丰富的Erlang程序员 - 我看到他在会议上发表了一些主题演讲或其他内容(我在网上看到了)。

这种事情曾经发挥作用但不再适用吗?当然有一种方法可以做我想做的事情 - 在没有冗长和样板的情况下调用这些函数。

编辑:如果我正确阅读文档,似乎暗示我顶部的示例应该有效(第8.6节)http://erlang.org/doc/reference_manual/expressions.html

3 个答案:

答案 0 :(得分:7)

在表达式X=abs中, abs 不是函数,而是原子。如果你想这样定义一个函数,你可以这样做:

D = fun erlang:abs/1.

左右:

X = fun(X)->abs(X) end.

答案 1 :(得分:7)

  

我知道abs是一个原子,而不是一个函数。 [...]为什么在使用模块名称时它会起作用?

The documentation解释了(略微重组):

ExprM:ExprF(Expr1,...,ExprN)
     

ExprMExprF中的每一个必须是原子或表达式   评估原子。据说这个函数是通过使用来调用的   完全限定的功能名称。

ExprF(Expr1,...,ExprN)
     

ExprF   必须是一个原子或评价一个有趣的。   如果ExprF是一个原子,则说该函数是使用隐式限定的函数名称调用的。

  • 当使用完全限定的函数名时,Erlang期望 atoms 表达式计算为 atoms 。换句话说,您必须将X绑定到 atom X = atom.这正是您提供的内容。
  • 但是在第二种形式中,Erlang期望 atom 表达式评估为函数 。注意最后一个字。换句话说,如果您使用完全限定的函数名称,则必须将X绑定到函数:X = fun module:function/arity.

答案 2 :(得分:1)

尝试:

X = fun(Number) -> abs(Number) end.

<强>更新

在更多地讨论讨论之后,您似乎想要将多个功能应用于某些输入。

我个人没有使用过两个项目,但我已经在Github上出演过你可能正在寻找的项目。

这两个项目都使用解析转换:

Pipeline是唯一的,因为它使用特殊语法:

Result = [fun1, mod2:fun2, fun3] (Arg1, Arg2).

当然,也可以使用{module, function}元组列表编写自己的函数来执行此操作,并将函数应用于上一个输出,直到得到结果。