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