Skip to content

Instantly share code, notes, and snippets.

@tjweir
Last active December 13, 2023 12:27
Show Gist options
  • Select an option

  • Save tjweir/d9b720ee0234ab6af0f5 to your computer and use it in GitHub Desktop.

Select an option

Save tjweir/d9b720ee0234ab6af0f5 to your computer and use it in GitHub Desktop.
Universal server from Joe Armstrong, can I make it turn back into a universal server after?
-module(fav1).
-export([test/0]).
test() ->
Pid = spawn(fun universal_server/0),
Pid ! {become, fun fac_server/0},
Pid ! {self(), 50},
receive
Y -> Y
end,
Pid2 = spawn(fun universal_server/0),
Pid2 ! {become, fun fib_server/0},
Pid2 ! {self(), 50},
receive
X -> X
end,
{X, Y}.
universal_server() ->
receive
{become, F} -> F()
end.
fac_server() ->
receive
{From, N} ->
From ! factorial(N),
fac_server()
end.
factorial(0) -> 1;
factorial(N) -> N * factorial(N-1).
fib_server() ->
receive
{From, N} ->
From ! fib(N),
fib_server()
end.
fib(0) -> 0;
fib(1) -> 1;
fib(N) -> N + fib(N-1).
%% in repl:
%% > c(fav1).
%% > fav1:test().
%% {30414093201713378043612608166064768844377641568960512000000000000, 1275}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment