Basic format:
list MATCHES patternPattern specification can contain the following:
1) [cat mouse x 99 'string']
literal words numbers, strings, and other items to be
checked in the target list
2) =
The 'Gobble-one' spacer
3) ==
The 'Gobble-any' spacer
4) ^A
Put into the pattern an object which is the value of the
variable A. That object will then be compared with the
corresponding object in the target list.
^(<expression>)
Put into the pattern whatever results from evaluation of
the expressin.
5) ^^A
The variable A MUST have a list as value. Put into the pattern
all the elements of the list, for comparison with elements of
the target list.
6) ?A
Set the value of the variable A to be a single element in the
matching target list.
7) ??A
Set the value of the variable A to be a list containing a
sequence of elements in the target list.
8) ?A:TEST
Only allow the variable A to match an element such that TEST(A)
is not FALSE.
9) ??A:TEST
Like (8), but the TEST is applied to a LIST of successive elements
from the target list to be matched against the variable A.
(Future versions of Pop-11 with a more sophisticated matcher will use
additional pattern element formats.)
NOTE: If the predicate TEST in the last two cases returns not TRUE but some other non-FALSE result, then the result will be assigned to the variable A instead of the item or list of items from the target list. For example, define a procedure to recognize a list of colours, and return a list of their initials:
First a procedure to produce a one character word from a word:
define initial(word);
subword(1,1,word)
enddefine;
Use that to define a procedure that returns a list of initials if given
a list of colour words:
define all_colours(list) -> result;
;;; given a list of colour words return a list of single
;;; character words, using the first character of each word.
lvars item;
for item in list do
unless member(item, [red green blue indigo violet orange])
then
false -> result;
return();
endunless;
endfor;
;;; create list of initials
maplist(list, initial) -> result;
enddefine;
all_colours([red square]) =>
** <false>
all_colours([green red orange]) =>
** [g r o]
This can be used to transform the output of the matcher, because it
returns the transformed list rather than simply true. E.g.
vars colours;
[the big green blue red orange thing on the wall]
matches [== ??colours:all_colours thing ==] =>
** <true>
colours =>
** [g b r o]
See HELP MATCHES/RESTRICTIONS