Next: Special Purpose Functions
Up: Primitives
Previous: Functions on Type t_list
  Contents
Functions on type t_binding
t_bool
operator==(t_binding b1, t_binding b2)
Returns true if b1 and b2 are bindings of the same
length containing the same names (in order) bound to (recursively)
equal values, and false otherwise.
t_bool
operator!=(t_binding b1, t_binding b2) =
operator!(operator==(b1, b2))
t_binding
_bind1(t_text n, t_value v)
If n is not empty,
returns a binding with
the single (name, value) pair (n, v).
If n is empty, the evaluation halts with a runtime error.
t_binding
_head(t_binding b)
Returns a binding with one (name, value) pair equal to the first
element of b. If b is empty,
the evaluation halts with a runtime error.
t_binding
_tail(t_binding b)
Returns the binding consisting of all elements of b, in order,
except the first. If b is empty,
the evaluation halts with a runtime error.
t_int
_length(t_binding b)
Returns the number of (name, value) pairs in b.
t_binding
_elem(t_binding b, t_int i)
Returns a binding consisting solely of the i-th
(name, value) pair in the binding b.
If no such pair exists, the evaluation halts with a runtime error. The
first pair of a binding has index 0.
t_text
_n(t_binding b)
If _length(b) = 1, returns the name part of the
(name, value) pair that constitutes b. Otherwise,
the evaluation halts with a runtime error.
t_value
_v(t_binding b)
If _length(b) differs from 1,
the evaluation halts with a runtime error.
Otherwise, let v be the value part of the (name, value)
pair that constitutes b. This function returns v.
t_bool
_defined(t_binding b, t_text name)
If name is empty, the evaluation halts with a runtime error.
Otherwise, the function returns
true if the binding b contains a pair (n, v) with
n identical to name, and false otherwise.
t_value
_lookup(t_binding b, t_text name)
If name is nonempty and is
defined in b, returns the value associated with it; otherwise,
the evaluation halts with a runtime error.
t_binding
_append(t_binding b1, t_binding b2)
Returns a binding formed by appending b2 to b1, but only
if all the names in b1 and b2 are distinct. Otherwise,
the evaluation halts with a runtime error.
t_binding
operator+(t_binding b1, t_binding b2) =
{
val r = emptybinding;
for (; !(b1 == emptybinding); b1 = _tail(b1)) {
val n = _n(_head(b1));
val v;
if (_defined(b2, n) == true)
v = _lookup(b2, n);
else v = _v(_head(b1));
r = _append(r, _bind1(n, v));
}
for (; !(b2 == emptybinding); b2 = _tail(b2)) {
if (_defined(b1, _n(_head(b2)) == false)
r = _append(r, _head(b2));
}
return r;
}
Returns a binding formed by appending b2 to b1, giving
precedence to b2 when both b1 and b2 contain
(name, value) pairs with the same name.
t_binding
operator++(t_binding b1, t_binding b2) =
{
val r = emptybinding;
for (; !(b1 == emptybinding); b1 = _tail(b1)) {
val n = _n(_head(b1));
val v;
if (_defined(b2, n) == true) {
val v2 = _lookup(b2, n);
if (_is_binding(v2) == true) {
v = _v(_head(b1);
if (_is_binding(v) == true)
v = operator++(v, v2);
else v = v2;
}
else v = v2;
}
else v = _v(_head(b1));
r = _append(r, _bind1(n, v));
}
for (; !(b2 == emptybinding); b2 = _tail(b2)) {
if (_defined(r, _n(_head(b2)) == false)
r = _append(r, _head(b2));
}
return r;
}
Similar to operator+, but performs the operation recursively for each
name n that is associated with a binding value in both b1
and b2.
t_binding
operator-(t_binding b1, t_binding b2) =
{
val r = emptybinding;
for (; !(b1 = emptybinding); b1 = _tail(b1)) {
val n = _n(_head(b1));
if (_defined(b2, n) == false)
r = _append(r, _head(b1));
}
return r;
}
Returns a binding formed by removing from b1 any pair
(n, v) such that the name n is defined in b2.
The value v associated with n in b2 is irrelevant.
t_binding
_sub(t_binding b, t_int start = 0, t_int len = _length(b))
{
int w = _length(b);
int i = _min(_max(start, 0)), w);
int j = _min(i + _max(len, 0), w);
// 0 <= i <= j <= _length(b); extract [i..j)
t_binding r = emptybinding;
for (; i < j; i++) r = _append(r, _elem(b, i));
return r;
}
Returns the sub-binding of b of length len starting at
element start. Note the boundary cases defined by
the pseudo-code; _sub produces a runtime error only if it
is passed arguments of the wrong type.
t_binding
_map(t_closure f, t_binding b) =
{
t_binding res = emptybinding;
for (; !(b == emptybinding); b = _tail(l)) {
// apply the closure "f"
t_binding b1 = f(_n(_head(b)), _v(_head(b)));
res = _append(res, b1);
}
return res;
}
Returns the binding that results from applying the closure f to each
(name, value) pair of the binding b, and
appending the resulting bindings together. The closure f should take
the name (of type t_text) and value (of type t_value) as
arguments, and return a value of type t_binding. If f has the
wrong signature, the evaluation halts with a runtime error.
t_binding
_par_map(t_closure f, t_binding b)
Formally equivalent to _map, but the implementation
may perform each application of f in a separate parallel thread.
External tools invoked by _run_tool in different threads
may be run simultaneously on different machines.
If a runtime error occurs in one thread, the other threads may
still run to completion before the evaluation terminates.
Next: Special Purpose Functions
Up: Primitives
Previous: Functions on Type t_list
  Contents
Allan Heydon, Roy Levin, Timothy Mann, Yuan Yu