[erlang-questions] Looking for a code review
Richard A. O'Keefe
ok@REDACTED
Wed Sep 10 08:06:00 CEST 2008
On 10 Sep 2008, at 4:19 pm, Bill McKeeman wrote:
Xs = samples(N, B-Dx, Dx, [B]), % N+1 sample points
Fs = fvals(F, Xs, []), % N+1 sample values
...
samples(0, _M, _Dx, L) -> L;
samples(N, M, Dx, L) -> samples(N-1, M-Dx, Dx, [M|L]).
fvals(_F, [], L) -> L;
fvals(F, [X|Xs], L) -> [F(X) | fvals(F, Xs, L)].
I'd be inclined to write
Xs = [A+I*Dx || I <- lists:seq(0, N)],
Fs = [F(X) || X <- Xs],
The 'dock' function does a receive expecting only to receive
a message from a worker; that means you cannot use this code
in any process that might receive a message from anywhere else.
This is the only thing that really *NEEDS* fixing.
I'd be inclined to fold together launching and spawning; what
was the reason for separating them?
start([_], [_], _, _, Workers) -> Workers;
start([X1|Xs=[X2|_]], [F1|Fs=[F2|_]], Tol, Self, Workers) ->
Worker = spawn(fun () -> worker(X1, X2, F1, F2, Tol, Self) end),
start(Xs, Fs, Self, [Worker|Workers]).
In fact, we don't need these lists. So
run(F, A, B, Tol, N) ->
Dx = (B - A)/B,
Self = self(),
lists:sum([receive {Worker,Value} -> Value end
|| Worker <- start(0, N, A, A, Dx, F(A), Tol, Self, [])]).
start(N, N, _. _, _, _, _, Workers) ->
Workers;
start(I, N, X1, A, Dx, F1, Tol, Self, Workers) ->
J = I + 1,
X2 = I*Dx + A,
F2 = F(X2),
Worker = spawn(fun () -> worker(X1, X2, F1, F2, Tol, Self) end),
start(J, N, X2, A, Dx, F2, Tol, Self, [Worker|Workers]).
worker(X1, X2, F1, F2, Tol, Master) ->
....
Master ! Value.
More information about the erlang-questions
mailing list