我正在尝试将现有的C函数转换为Erlang,但我在理解它如何工作时遇到了一些问题。假设我在C中有以下函数:
void(int *x,int *y,int z,int a)
{
if(z<a)
{
*x = z + a;
*y = z - a;
}
}我该如何在Erlang中将其作为函数模块来编写呢?我知道通常你写你的函数,它会返回一个操作。但是,如果我必须对多个变量进行计算呢?
发布于 2012-08-28 15:02:12
您可以返回如下元组:{X,Y}
下面是一个函数,它将作为输入给出的两个值加倍:
-module(my_module).
-export([doubleus/2]).
doubleus(X, Y) ->
{X*2, Y*2}.在shell中:
1> c(my_module).
{ok, my_module}
2> {A, B} = my_module:doubleus(3,4).
{6, 8}发布于 2012-08-28 16:09:06
使用指针操作-意味着您可能会更改内存中某些位置的状态(对于顺序流来说,这并不是那么糟糕)。
但在并发环境中,这可能会间接导致指向该位置的每个进程发生不可预测的变化(特别是在竞态条件下)。
这就是为什么Java中有这么多面向并发的机制。
但这不是Erlang的方式。一般来说,Erlang中没有指针,也没有共享内存。
例如,您可以在元组{ 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.https://stackoverflow.com/questions/12153967
复制相似问题