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}

以下は、入力として与えられた 2 つの値を 2 倍にする関数です。

-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を tuple に格納{ X, Y, Z, A }し、関数から関数に渡すことができます。関数が新しい状態タプルを返す場合があります。

上記のコンテキストでは、関数は次のようになります。

-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 に答える