So far we have seen how procedures can be used as data, e.g. giving double as argument to the composition operator, and saving the created procedure in a variable, etc.
Not only can many different things be done with procedures in Pop-11: it is also possible to treat certain objects as if they were procedures in order to obtain general and modular programs. For example, consider a list of three words:
vars numlist = [cat dog mouse];Although this is not actually a procedure, it has, from the mathematical point of view, some of the properties of a procedure (or a function) in that you can think of it as mapping the first three integers onto three words. We can define a procedure that does this:
define int_to_word(int) -> result; if int == 1 then "cat" -> result; elseif int == 2 then "dog" -> result elseif int == 3 then "mouse" -> result else mishap('NUMBER TOO BIG', [^int]) endif enddefine;then we can use the procedure thus:
int_to_word(1) => ** cat int_to_word(2) => ** dog int_to_word(3) => ** mouse int_to_word(4) => ;;; MISHAP - NUMBER TOO BIG ;;; INVOLVING: 4 ;;; DOING : int_to_word compile ...However, in Pop-11 you do not need to define such a procedure. You can use the list itself as a procedure by applying it to integers as if it were a procedure, or mathematical function, thus:
numlist(1) => ** cat numlist(3) => ** mouse numlist(4) => ;;; MISHAP - BAD ARGUMENTS FOR INDEXED LIST ACCESS ;;; INVOLVING: 4 [cat dog mouse] ;;; DOING : ...Moreover, because numlist is a list, its contents can be changed, altering the behaviour of the procedure or function that it simulates:
"snake" -> numlist(2);then
numlist(2) => ** snakeSimilarly vectors and strings can be treated as procedures, in Pop-11.
vars vec = {966 77 88 99}, string = 'the cat'; vec(3) => ** 88 string(1) => ** 116 string(2) == `h` => ** <true>(Remember that the strings are actually vectors of 8 bit integers, representing character codes, as described in HELP ASCII, HELP STRINGS)
(NOTE: This use of integers for indexed access does not work with records in Pop-11: they are assumed to have components that are accessible only via particular named procedures associated with the record class.)