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)