Back to library index.
Package std-advanced (in std.i) - performance and interface optimizations
Index of documented functions or symbols:
DOCUMENT eq_nocopy, y, x
is the same as
y= x
except that if x is an array, it is not copied, even if it is
not a temporary (i.e.- an expression). Having multiple variables
reference the same data can be confusing, which is why the default
= operation copies the array. The most important use of eq_nocopy
involves pointers or lists:
y= *py
z= _car(list)
always causes the data pointed to by py to be copied, while
eq_nocopy, y, *py
eq_nocopy, z, _car(list)
does not copy the data - often more nearly what you wanted.
Note that scalar int, long, and double variables are always copied,
so you cannot count on eq_nocopy setting up an "equivalence"
between variables.
DOCUMENT errs2caller, f1, f2, ... makes function F1 (and optionally F2, ...) pass control for dbug mode to its caller if a fault occurs inside F1. This makes F1 behave more like a compiled function for its caller. For example, if you are writing a mathematical function, you can raise an error in its caller rather than in the function itself -- which is appropriate if the only errors your function raises are, for example, domain errors. Your function will then respond to a domain error in the same way as, for example, asin(1.5). If you want to wrap arguments of such a function, you need to call errs2caller before wrap_args.
SEE ALSO: wrap_args
DOCUMENT swap, a, b;
Exchanges the contents of variables A and B without requiring any
temporary copy. The result of the call is identical to:
tmp = a; a = b; b = tmp;
which makes a copy of A and then a copy of B. Another possibility which
avoids any copy of A nor B is:
local tmp;
eq_nocopy, tmp, a; eq_nocopy, a, b; eq_nocopy, b, tmp;
DOCUMENT unref(x) Returns X, destroying X in the process if it is an array (useful to deal with temporary big arrays).
DOCUMENT wrap_args, interpreted_function
converts INTERPRETED_FUNCTION to a wrapped_func object,
which will accept an arbitrary argument list, then invoke
INTERPRETED_FUNCTION with a single wrapped_args object as
its argument. The INTERPRETED_FUNCTION must be declared as:
func INTERPRETED_FUNCTION
...use args object to retrieve actual arguments...
}
wrap_args, INTEPRETED_FUNCTION;
After wrapping, you invoke the function as usual:
result = INTERPRETED_FUNCTION(arg1, key1=ka1, arg2, ...);
Unlike an ordinary interpreted function, a wrapped function
will accept any number of arguments, and keyword arguments
of any name. Furthermore, unlike an ordinary function, you
can determine the number of arguments passed to the function,
the names of any simple variable references passed to the
function, and other useful information about the arguments.
You can set the external value of any simple variable passed
as an argument, as if it had been declared func f(..., &x, ...).
A wrapped_func function call is less efficient and requires
less transparent coding than an ordinary function call; the
advantage is that you can write a wrapped function which has
non-standard semantics, for example, like the save and restore
built-in functions (which use the names of the arguments passed
to them), or other special effects, like accepting arbitrary
keyword names.
The ARGS object, the single argument actually passed to
your INTEPRETED_FUNCTION, is a wrapped_args object, which has
the following Eval methods:
ARGS(-) returns [keyname1, keyname2, keyname3, ...]
the actual names of the keyword arguments passed
or nil [] if no keywords were passed
ARGS(*,) is a synonym for ARGS(-) to resemble
the object syntax (see help,oxy), although the
analogy is not exact.
ARGS(0) returns the number of positional arguments passed
ARGS(*) is a synonym for ARGS(0) to resemble
the object syntax (see help,oxy), although the
analogy is not exact.
ARGS(i) returns the i-th positional argument
i can also be a string to return a keyword argument,
or a negative number to return the -i-th keyword
ARGS, i, value
sets the value of argument i, as if it were
an output variable declared as func f(..., &x, ...)
ARGS(-,i) returns the name of argument i if it was
passed as a simple variable reference
ARGS(*,i) is a synonym for ARGS(-,i) to resemble
the object syntax (see help,oxy), although the
analogy is not exact.
ARGS(0,i) returns a flag describing the argument:
0 if argument is a simple variable reference (set value works)
1 if argument is an expression (set value will be discarded)
2 if argument does not exist (as opposed to simply nil)
For obscure situations, there is also:
ARGS(i,:) same as ARGS(i), except if the argument is an lvalue,
it is not fetched.
This rather arcane feature permits you to pass an argument of the
form f.x, where f is a file handle, to functions like dimsof or
structof without triggering a read of the file. Do not assign
the result to a variable; use it only as an argument to another
function. The first time you call ARGS(i) for argument i, the
lvalue is fetched, and ARGS(i,:) will do nothing special.
SEE ALSO: errs2caller
