When declaring a table, you can specify a number of attributes that affect its operation:
&default
&default = expr
expr can have one of two forms. If it's type is the same as
the table's yield type, then expr is evaluated and returned.
If it's type is a function with arguments whose types correspond
left-to-right with the index types of the table, and which returns
a type the same as the yield type, then that function is called with
the indices that yielded the missing value to compute the default value.
For example:
global a: table[count] of string &default = "nothing special";
will return the string "nothing special" anytime a is
indexed with a count value that does not appear in a.
A more dynamic example:
function nothing_special(): string
{
if ( panic_mode )
return "look out!";
else
return "nothing special";
}
global a: table[count] of string &default = nothing_special;
An example of using a function that computes using the index:
function make_pretty(c: count): string
{
return fmt("**%d**", c);
}
global a: table[count] of string &default = make_pretty;
&create_expire
&create_expire = expr
where expr is of type interval.
&read_expirecreate_expire except the element is deleted
when the given amount of time has lapsed since the last time the
element was accessed from the table.
&write_expire&create_expire except the element is deleted
when the given amount of time has lapsed since the last time the
element was entered or modified in the table.
&expire_func
&expire_func = expr
expr must be a function that takes two arguments:
the first one is a table with the same index and yield types as the
associated table. The second one is of type any and
corresponds to the index(es) of the element being expired.
The function must return an
interval value.
The interval indicates for how much longer the element should
remain in the table; returning 0 secs or a negative value instructs
Bro to go ahead and delete the element.
Deficiency: The use of an any type here is temporary and will be changing in the future to a general tuple notion.
You specify multiple attributes by listing one after the other, without commas between them:
global a: table[count] of string &default="foo" &write_expire=5sec;
Note that you can specify each type of attribute only once. You can, however, specify more than one of &create_expire, &read_expire, or &write_expire. In that case, whenever any of the corresponding timers expires, the element will be deleted.