View Source espace (espace v0.9.0)

This module provides the client access to the user applications.

In order to run any espace based applications the application needs to be started using one of the start/0,1 functions.

Multiple independent instances of espace can be active within the same node without interfering with each other. There can be up to one unnamed instance, and as many named instance as desired. Instance names are short atoms that are appended to the various server and table names.

All client functions here have two variants, with and without instance name. If no instance name is supplied, or if the instance name is espace, then the unnamed instance is assumed.

Summary

Functions

Perform an eval operation via the unnamed espace server.

Perform an eval operation via a named espace server.

Perform an in operation via the unnamed espace server.

Perform an in operation via a named espace server.

Read and process an espace input file via the unnamed server.

Read and process an espace input file via a named server.

Perform an inp operation via the unnamed espace server.

Perform an inp operation via a named espace server.

Perform an out operation via the unnamed espace server.

Perform an out operation via a named espace server.

Perform a rd operation via the unnamed espace server.

Perform a rd operation via a named espace server.

Perform a rdp operation via the unnamed espace server.

Perform a rdp operation via a named espace server.

Start a new unnamed instance of espace.
Start a new named instance of espace.
Stop the unnamed instance of espace.
Stop a named instance of espace.

start a new worker process via the unnamed espace server.

start a new worker process via a named espace server.

Functions

eval(Tuple)

-spec eval(tuple()) -> pid().

Perform an eval operation via the unnamed espace server.

See eval/2 for details.

eval(Inst_name, Tuple)

-spec eval(atom(), tuple()) -> pid().

Perform an eval operation via a named espace server.

The input Tuple is evaluated in a worker process and the result is sent to the tuple space using out operation.

The function returns the pid of the worker process.

The elements of the output tuple correspond to those of Tuple. If any of the elements of Tuple match the function pattern, then the corresponding output element will be the value of the function.

The following patterns will trigger the evaluation of the second element of the tuple:

  1. Anonymous function, e.g. {aa, fun () -> 2+3 end, zz}.
  2. Tuple with function and args, e.g. {aa, {fun (X,Y) -> X+Y end, [2, 3]}, zz}

Both examples above will produce {aa, 5, zz}

In the first example we have a fun expression of arity zero. In the second, we have a pair (tuple) of a fun expression and a list, and the arity of the fun matches the length of the list.

Any other pattern will move the element to the output tuple untouched.

in(Pattern)

-spec in(tuple()) -> {list(), tuple()} | quit.

Perform an in operation via the unnamed espace server.

See in/2 for details.

in(Inst_name, Pattern)

-spec in(atom(), tuple()) -> {list(), tuple()} | quit.

Perform an in operation via a named espace server.

For details of possible patterns see the match_spec in ets:match/2,3. Pattern must be a tuple. It may consist of expressions, or it may contain $N pattern variables, where N>0.

If the pattern does not match a tuple in the tuple space, then the call will block until such a pattern is added to the tuple space. If the espace server terminates while the client is in blocking state the atom quit will be returned.

If a match is found, the tuple is returned as a pair {List, Tuple}, where Tuple is the whole tuple, and List is a, possibly empty, list containing the matched $N pattern variables. The items in the list will be ordered by the $N variable numbers.

For example the tuple {add, 34, 88} will match the pattern {add, '$2', '$1'}, and the returned result will be '{[88, 34], {add, 34, 88}}'. Note the order of the numbers in the list.

The matched tuple will be removed from the tuple space.

infile(File)

-spec infile(file:name_all()) -> ok.

Read and process an espace input file via the unnamed server.

See infile/2 for details.

infile(Inst_name, File)

-spec infile(atom(), file:name_all()) -> ok.

Read and process an espace input file via a named server.

The file should be a valid Erlang terms file.

inp(Pattern)

-spec inp(tuple()) -> nomatch | {list(), tuple()}.

Perform an inp operation via the unnamed espace server.

See inp/2 for details.

inp(Inst_name, Pattern)

-spec inp(atom(), tuple()) -> nomatch | {list(), tuple()}.

Perform an inp operation via a named espace server.

The inp/1,2 functions are the non-blocking versions of in/1,2`. If a match is not found in the first instance, then the atom `nomatch is returned. If a match is found, then it will be removed from the tuple space and returned as a {List, Tuple} pair.

See in/1,2 for details and examples of the match patterns.

out(Tuple)

-spec out(tuple()) -> done.

Perform an out operation via the unnamed espace server.

See out/2 for details.

out(Inst_name, Tuple)

-spec out(atom(), tuple()) -> done.

Perform an out operation via a named espace server.

The Tuple supplied as argument will be added to the tuple space. Duplicate tuples are allowed in the tuple space.

rd(Pattern)

-spec rd(tuple()) -> {list(), tuple()} | quit.

Perform a rd operation via the unnamed espace server.

See rd/2 for details.

rd(Inst_name, Pattern)

-spec rd(atom(), tuple()) -> {list(), tuple()} | quit.

Perform a rd operation via a named espace server.

The rd/1,2 functions behave in the same manner as in/1,2 except that when a matching tuple is found, it will not be removed from the tuple space.

rdp(Pattern)

-spec rdp(tuple()) -> nomatch | {list(), tuple()}.

Perform a rdp operation via the unnamed espace server.

See rdp/2 for details.

rdp(Inst_name, Pattern)

-spec rdp(atom(), tuple()) -> nomatch | {list(), tuple()}.

Perform a rdp operation via a named espace server.

The functions rdp/1,2 are the non-blocking versions of rd/1,2. That is, if a match is not found, then nomatch is returned, and if a match is found the matching tuple will be return, but it will not be removed from the tuple space.

start()

-spec start() -> ok | {error, term()}.
Start a new unnamed instance of espace.

start(Inst_name)

-spec start(atom()) -> ok | {error, term()}.
Start a new named instance of espace.

stop()

-spec stop() -> ok | {error, term()}.
Stop the unnamed instance of espace.

stop(Inst_name)

-spec stop(atom()) -> ok | {error, term()}.
Stop a named instance of espace.

worker(MFA)

-spec worker(tuple()) -> pid().

start a new worker process via the unnamed espace server.

See worker/2 for details.

worker(Inst_name, _)

-spec worker(atom(), tuple()) -> pid().

start a new worker process via a named espace server.

The function expects a single tuple as argument, which can have one of the following forms:

  • A {Mod, Fun, Args} triple, e.g. {adder1, test_add2, []}.
  • A single fun without args, e.g. {fun () -> adder1:test_add2() end}, or {fun adder1:test_add2/0}.
  • A single fun with args, e.g. {fun (A,B) -> adder1:test_add2(A,B) end}, or {fun adder1:test_add2/2, [A,B]}.
  • A string containing a fun, e.g. "fun () -> adder1:test_add2() end.". This is mainly for use in espace input files.