2

我正在尝试将现有的 C 函数转换为 Erlang,但在理解它将如何工作时遇到了一些麻烦。假设我在 C 中有以下函数:

    void(int *x,int *y,int z,int a)
    {
     if(z<a)
      {
     *x = z + a;
     *y = z - a;
      }
     }

我将如何在 Erlang 中将类似的东西作为功能模块编写?我知道通常你编写你的函数,它会返回一个操作。但是如果我必须对多个变量进行计算怎么办?

4

2 回答 2

8

你可以返回一个像这样的元组:{X, Y}

这是一个将作为输入的两个值加倍的函数:

-module(my_module).
-export([doubleus/2]).

doubleus(X, Y) ->
    {X*2, Y*2}.

在外壳中:

1> c(my_module).
{ok, my_module}
2> {A, B} = my_module:doubleus(3,4).
{6, 8}
于 2012-08-28T07:02:11.773 回答
2

使用指针操作 - 意味着您可以更改内存中某个位置的状态(对于顺序流来说还不错)。

但是在并发环境中,这可能会间接导致指向该位置的每个进程发生不可预测的变化(尤其是在竞争条件下)。

这就是为什么Java中有这么多面向并发的机制。

但这不是 Erlang 的方式。一般来说 - Erlang 中没有指针,也没有共享内存。

例如,您可以将state{ X, Y, Z, A }存储在 tuple中,并将其从一个函数传递到另一个函数。有时你的函数会返回新的状态元组。

在上述上下文中,您的函数可能如下所示:

-module( my_module ).
-export( [ f/1 ] ).

f( { _X, _Y, Z, A } ) when Z < A -> { Z + A, Z - A, Z, A };
%% othervise - don't change the state
f( State ) -> State.
于 2012-08-28T08:09:06.313 回答