action
new shelf ({string-expression})? insertion-point? set new shelf ({ string-expression})? insertion-point? to expression
Argument definitions
new
inserts a new item onto a shelf and can only be invoked on shelves that have been declared
variable
:
local integer x variable initial-size 0 new x
By default, the new item is inserted after the last item on the shelf. You can insert the new item before or
after another item:
new x{"wilma"} after [2]
To make the new item the first item on the shelf, you can use before [1]
or after
[0]
.
A new item can be given a key as it is inserted:
new x{"fred"} before {"barney"} new x{"wilma"} after [2]
The set new
action combines the new
and set
actions into one action so
that
new x{"fred"} before [1] set x{"fred"} to "flintstone0"can be replaced with:
set new x{"fred"} before [1] to "flintstone0"
Putting these code fragments together gives us the following program:
process local string x variable new x set key of x to "barney" set x to "flintstone1" set new x{"fred"} before [1] to "flintstone3" set x{"fred"} to "flintstone0" new x{"wilma"} after [2] set x{"wilma"} to "flintstone2" repeat over x output x || " has key " || key of x || "%n" again ; Output: "flintstone0 has key fred ; flintstone1 has key barney ; flintstone2 has key wilma"
The new
operator can be used in expressions, wherever you refer to a shelf item. For example, in
an increment statement:
process local integer i variable increment new i
Here the expression-level new
creates a new item on the shelf i
and then the increment
action increments it.
OmniMark does not allow you to add a new item to a shelf if the key you specify already exists on the shelf.
Although you can test for this conflict to avoid a program error,
process local integer i variable new i{"a"} unless i has key "a" increment i {"a"}it is more concise to use the guarded form of
new
, new?
to express this logic:
process local integer i variable new? i{"a"}
A key is required when using the guarded form of new
.
The following example shows how you can use new?
to easily remove duplicates from a data set.
The following is a list of index entries with page references. The problem is to remove the duplicate entries,
but also to maintain a count of the duplicates as an indication of when a topic is most heavily discussed. The
data is as follows:
OmniMark 1 streaming 2 OmniMark 4 OmniMark 4 streaming 4
Using the guarded new
operator, this problem is easily solved:
declare record usage-type field integer reference variable global usage-type usage variable process submit #main-input repeat over usage output key of usage repeat over usage:reference as reference output "," unless #first output " " || key of reference || " (" || "d" % reference || ")" again output "%n" again find letter+ => word blank digit+ => page "%n" increment new? (new? usage {word}):reference{page}
The inner guarded new
of the find
rule's increment
action creates a new word
entry if the word has not been encountered. The outer guarded new
creates a new page reference if
the page has not been encountered and then it passes the page entry, new or otherwise, to increment
,
which increases its count. The output of this program when given the input above is:
OmniMark 1 (1), 4 (2) streaming 2 (1), 4 (1)