The Description of Computing Processes: Some Observations on Automatic Programming and ALGOL 60 M. WOODGER National Physical Laborator;y
SUMMARy-This paper is the result of an attempt to sort out the basic ideas involved in the description of a computing process as a program for a computer, expressed in a formal symbolic language such as ALGOL 60. The emphasis is on the information conveyed by the program constituents, i.e. its semantics, rather than the particular form used, i.e, its syntax. A preliminary section discusses the fact that a process description is in practice always incomplete, and relative to some assumed level of detail of analysis, in the sense that it indicates a sequence of subprocesses (such as arithmetic operations) to be carried out in a particular order, but stops short of the description of how each subprocess effect is achieved. The essential features of the use of names for reference to stored information are reviewed. Next some characteristic features of ALGOL 60 are mentioned, and detailed suggestions are made as to how they may be generalized and unified so as to reduce the number of anomalies in that language and consequently to reduce the number of separate ideas which have to be assimilated in order to understand it. The principle adopted in this generalization is to observe what facilities have already to be provided for the correct handling of ALGOL 60 as source language, and to allow the free use of these facilities. One important feature is the use oflists of quantities as values of variables, assignable as a whole, as the result of evaluating expressions of type list (i.e, vector) or list list (l.e, including matrix). A second important feature is the use of names (identifiers) in general as permissible values of variables of type name. The avoidance of generating program at run time, as in ALGOL 60, is maintained-an expression or statement may not be produced as value of an expression and assigned to a variable, although it may be associated with a name by appearing in a declaration. I
2
M. Woodger
1. GENERAL REMARKS
1.1. The physical realization of a computing process as a program for a digital computer depends essentially upon two things. In the first place, the data to be processed is expressed in finite digital form . In the second place, the process itself is expressed as the overall effect of a finite number of discrete steps to be carried out in a specified sequence. A complete description of such a process would detail each of these aspects down to the last digit, specifying how each digit of the result of the process was to be derived from each digit of the data. In practice, such a description is never given; instead, familiarity is assumed with the details ofa class ofcommon constituent subprocesses, such as arithmetic operations on particular floating-point representations of real numbers using the conventions of the particular computer employed, and the process to be described is analysed only down to the level of a sequence of such subprocesses. If these subprocesses comprise the basic machine order code the analysis is complete as regards the particular computer in use. The discrete steps of the process correspond to the execution ofindividual machine instructions, and the finite digital form of the data at this level of analysis is governed by the word length and fixed conventions regarding number representation. The programmer is here not concerned at all with the way in which the individual machine instructions achieve their specific effects, or the order in which the digits of their results are produced, but only with the effects themselves. It is clear that the description of a process may either be timeless, in the sense that it simply states a result and in no way how the result is achieved, or it may in greater or less detail specify a temporal sequence of subprocesses which will produce this result, these subprocesses being themselves described only as to their results and not as to how these are achieved. Thus a subroutine for calculating the cosine of a floating-point number may be described' timelessly' in terms of'its overall result in its title, and processwise in terms of the basic machine code in the detailed program or flow diagram. The statement of a data-processing problem is a description of a desired process-result, a functional relationship, and its solution from the programmer's point of view, is an expression of this result as the outcome ofa particular sequence of available programmed subprocesses. 1.2. A third fundamental feature ofprocesses carried out by a digital comis of course the use of stores for containing representations of the process description itself, as well as ofthe data being processed. An isolated
p~ter
The Description qfComputing Processes
3
use of a numerical constant in a calculation might only require it to be presented once at the input, and not stored. Likewise an instruction to perform a particular operation just once could be accepted once from the input and not stored. Storage must be used when an item of information (a datum or an instruction) is to be referred to (i.e. used) more times than it appears at the input, including the special case where it is generated internally by the process itself. We are using the word' instruction' in the sense of a representation of a subprocess description in the form of a stored pattern of digits which will cause that process to take place when this pattern is Cobeyed' by the machine, that is to say, when the' control' of the machine is directed to it. This presupposes mechanisms of selection of such patterns in store, and recognition of their extent, in addition to interpretation ofeach pattern as it is obeyed. The specification of the path followed by control when obeying the instructions is part of the process description itself, but is usually only made explicit where there is to be a deviation from simply following the linear arrangement of instructions in store. 1.3. By the current state of the machine at any instant between subprocesses during the execution of a program is meant the totality ofstored information at that instant, together with the position of the instruction about to be obeyed at that instant (the 'position of control'). This information determines the subsequent events, so that the process could be interrupted and subsequently completed on another occasion if only the current state were preserved. 1.4. Information used by an instruction (its' data ') may either
(a) appear explicitly in the program text with it (its position and extent governed by notational conventions), or (b) be available implicitly in store at a position determined by convention (such as the accumulator, the' store of position of control' or control counter, or the top cell of the 'stack' where this method of store management is used (Ref. l)), or (c) be detached information, available in store at a position determined by an identifier or name appearing in the instruction. (The identifier in this case is itself explicit information.) Information produced by the execution of an instruction (its 'results ') may likewise appear either implicitly in store at a position determined by convention (the accumulator, the control counter in the case of control
4
M. Woodger
jumps, or the top cell of the stack) or detached at a position determined by an identifier appearing in the instruction. It is this last detached information that is considered to be the subject matter of the process, since it alone can be altered in store by such an 'assignment' of a value to a name. In this sense the subject matter of an ALGOL 60 program comprises only single integers, real numbers, and logical values. 1.5. The use of names as parts of instructions for referring to detached information in store has the following important consequences: (a) Conventions must be assumed to connect the name with the store named. In particular, since storage is precious, conventions are required to sever this connection when no longer needed and thus free both storage and name for other use. (b) An instruction cannot be obeyed until all detached information which it uses occupies the named stores. (c) The stored information is independent of the instructions which use it (as data), in the sense that it may be altered without altering these instructions themselves. (d) An instruction using detached information expresses a generalized junction of that information, in that its effect depends directly upon that information. II . ALGOL 60
2.1. Among the essential features of ALGOL 60 (Ref. 2) are included the following: (1) A completely nested (bracketed) structure of the program text, used to define definite scopes of all identifiers employed for reference to detached information. (2) Complete freedom to elaborate and to compound the individual program structures to an arbitrary degree. (3) The provision for defining (with a few restrictions) aprocedure from any statement or block and any fixed list of identifiers as 'parameters', choosing for each one that it shall be 'called by name' or 'by value', and invoking such a procedure by name (as statement or as expression) with corresponding lists of' actual parameters'. (4) No reference whatever to storage ofinformation. (5) Subject-matter (i.e. information which can be generated and named) restricted to single numbers (real or integer) and logical values. (The provision for handling arrays does not permit the generation of an array by an assignment statement, so they are not subject-matter in the true
The Description of Computing Processes
5
sense, but rather ordered sets of numbers or logical values associated with a rule of selection using index values.) (6) As a particular consequence of (5), no operations upon parts of the program itself are expressible, so that all association of statements, expressions or procedures with their names may be done in a fixed manner in a preliminary translation phase before the calculation proper beings. In Section 3 I shall try to show some ways in which these features might be extended and unified, with a view to both strengthening the means of expression provided by the language and reducing the number of separate ideas which have to be assimilated in order to understand it.
2.2. In ALGOL 60 a declaration in a block head introduces an identifier and defines its scope as being that block (including the bodies of procedure declarations in its head, but excluding subblocks in whose head the same identifier is redeclared). It also provides all the detached information which will be referred to by instructions within the block which use that identifier and which is unalterable in the block (i.e, all but the actual values of variables) . For type declarations this information is the type of a simple variable. For array declarations it includes also the selection process whereby a list of index values is used to select one variable in the array, and a list of pairs of arithmetic expressions (i.e. programs) used once on entry to the block to specify the size and shape of the array (so-called' dynamic array declarations '). For switch declarations it includes the selection process whereby a single index value is used to select a designational expression in the switch list, and includes (in the form of programs) these designational expressions themselves. Finally, for procedure declarations the detached information provided is a process whereby a list ofactual parameters is used to complete the description ofa piece of program to be executed. 2.3. The inherent limitations on process description which were outlined in Section I are recognized in ALGOL 60. A process can be described in terms of a chosen set ofsubprocesses defined by procedure declarations, and its description apart from these declarations is independent of how these subprocesses are in fact achieved. But as regards the form of the data to be processed the language is on the one hand limited in detail to individual real numbers, integers and logical values, and in the other direction it allows no synthesis ofthese into compound forms which might be assigned as values of variables. Reference to the exponent or mantissa of a floating-point number is excluded, as are also matrix operations (other than as defined by explicit procedure declarations).
M. Woodger
6
III. OUTLINE OF THE SUGGESTED SEMANTICS
3.1 The subject-matter, i.e. information which may both be generated within the program by the evaluation of an expression and also then stored as the value assigned to a name, may be ofone ofthe following types. (This name is then a variable and this is its type.) +
Areal or integer number, for use in calculation. A Boolean value (i.e, logical value, true or false), for choice between alternatives. A symbol, for text manipulation. An index value (Le. positive in teger) , for selecting a component ofa list. A name, for indirect reference, including control jumps. A list of values of any of these types, for associating these together as components of one entity. The intention is that knowledge of the type of a variable shall suffice to determine the manner ofuse ofits value in the program, without examining that value itself. In the case of a variable N of type name, i.e. one whose value V is a name, no further information is needed ifthis value Vis to be simply assigned to another variable or inserted in a list. But if Vis to be evaluated (or otherwise used, ifnot itself a variable) it is necessary to indicate in the type of N what kind ofname Vis, that is to say the specification of the name V. Following the classification of the uses ofnames given in Section 3.2 we include in the type name the following subtypes. real name (i.e. name of a real) integer name Boolean naJUe symbol name index name label (i.e, statement name) expression name procedure nam.e list name, including real list name (i.e, name of list ofreals), etc. In the case ofa variable N of type list, whose value Vis a list of'subjectmatter items with a common type, the use of this list requires a knowledge ofhow to select its components, and a knowledge ofits extent in store if it is to be assigned to another variable or joined to another list to make a longer one. The length of the list, i.e, the number of its components, is part of the
The Description of Computing Processes
7
type ofN if assumed constant, but part ofthevalue if to be altered. According to the common type of the components, we include in the type list the following subtypes. real list (i.e. list ofreals) integer list Boolean list symbol list (i.e, string) index list name list, including real name list, etc. list list, including real list list (i.e. list oflists of reaIs) , etc. Appearing alone, these subtypes imply lists of alterable length. Fixed length mis indicated by following the type indication by (m), and in the case oftype list list with a fixed number m of components each of which is a list affixed length n, this is indicated by list list (m,n). 3.2. A name (identifier) is either (l) a variable, or (2) a name ofa particular statement in the text of the program, indicated by the name being attached to it as a label instead of appearing in a declaration in a block head, or (3) a name of a particular expression exhibited in the declaration for the name, or (4) a name of a particular procedure exhibited in the declaration for the name. 3.3. An expression is a piece of program which produces a result (its value) when executed (evaluated). The type ofthe expression is the type of this result. Evaluation of a constant is interpreted to mean producing the constant itself as value. Evaluation of a variable yields the value last assigned to it. Evaluation of'a list means evaluation ofits components in turn, resulting in a list of their values. Since we admit values of type name, any expression of this type could be further evaluated, so we adopt the convention that evaluation stops as soon as the value can be used in the context in which the expression appears. If further evaluation is nevertheless intended it is indicated by a special operator (script v).
3.4. An assignment statement takes the form N:=E where Nand E are expressions or lists of expressions.
8
M. Woodger
This means: 'Evaluate N, then evaluate E, then store the value of E in the store indicatedInamed) by the value ofN'. If the value ofN (but not that of E) is a list, then the value of E is assigned to each component. When Nand E are lists of equal length assignments of corresponding components occur. The types ofvalues assigned must be compatible with the types ofthe corresponding names . In accordance with the convention stated in the previous section, the evaluation ofN is suppressed when it is simply a variable of the same type as E, since it then already names a store for the value of E.
3.5. A declaration is a piece of program in a block head specifying the use ofa name in that block. 3.6. A declaration for a variable reserves space for its value and specifies its type, and may be combined with an assignment of an initial value to the variable. If N is the name and T the type the declaration takes the form. TN
or
TN:=E
where E is an expression whose value is to be assigned initially. E is to be evaluated using declarations valid at the moment of entry to the block, not other declarations in the same block head. 3.7. An expression declaration, i.e, a declaration for a name of a particular expression, exhibits the expression and its type (i.e. the type of values produced by executing it). IfN is the name, T the type and E the expression, it takes the form TN:E Occurrence of this name in an expression invokes the evaluation of the expression E. Thus one has in effect the facility of substitution ofan expression for a name (as when calling procedure parameters by name). In the special case when Eis simply a variable, N is effectively equivalent toE. In the special case when Eis simply a constant of type T, N is effectively equivalent to this constant. E may in particular be a list of expressions, in which case T must be a subtype of list. 3.8. A procedure declaration exhibits the name, the procedure (a statement or block, which may (but need not) produce a result as value), the type of the
The Description ojComputing Processes
9
result it produces (if any), and a list of names and their specifications (the formal parameters) which may occur in the procedure. It alsoindicates which of the formal parameters are to be called by name and which by value. If the procedure yields a result, this is produced as in ALGOL 60 by assignment to the procedure name. This may occur one component at a time if the result is a list. 3.9. A procedure statement consists of the procedure name (or a primary expression of type procedure name) followed by a list of expressions (the actual parameters). It is an instruction to execute the procedure withdeclarationsjor theformalparameters attachedto itshead, making them local to it, and converting it into a block ifit is not already one. For the parameters called by name these declarations are expression declarations using the corresponding actual parameter expressions, but to be evaluated using declarations which apply at the place where the procedure statement occurs, while for the parameters called by value they are variable declarations with initial assignment of value, using the corresponding actual parameter expressions evaluated in the same way.
3.10. A statement, i.e, a unit ofprogram with no designated' result', may be: an assignment statement, a procedure statement, a conditional statement,} a go-to statement as in ALGOL 60 a dummy statement, a sequence statement, or a compound statement or block as in ALGOL 60.
3.11. The sequence statement is a generalization of the 'for statement'. It contains as part a statement S. It may contain a list of'formal parameters, which may occurin S, and then indicates which are to be called by name and which by value. It may contain a sequencing clause, i.e. a piece of program which produces a list of values of corresponding actual parameters (called by value) each tim e it is invoked, or ajorlist, i.e, an explicit list ofsuch listsof actual parameters (expressions, called either by name or by value). Finally, it may contain a while clause, of the form' while B' where B is a Boolean expression. The sequence statement is an instruction to evaluate B, do nothing further (but proceed to the next statement) if this value is false, otherwise evaluate the sequencing clause, execute S as if it were a procedure called with the actual parameter values produced by the sequencing clause, and
10
M. Woodger
repeat this cycle of operations by evaluating B again. In the absence of a while clause the cycle begins with the sequencing clause, which then has the additional effect of terminating the execution when a stated list ofvalues is produced. In the absence of a sequencing clause S is merely repeated until B takes the value false, and in this case there are no parameters. If there is afor list in place of a sequencing clause its components are used in·turn as actual parameters, and the execution is terminated after use of the last component, ifnot previously by the while clause which may also be present. A sequence statement is thus analogous to a procedure call, with the procedure attached to it rather than invoked by name. 3.12. As in ALGOL 60, expressions are built up from 'primary' expressions using suitable operation signs. The primary expressions of any type T include representations of constant values of type T (such as -2,03 10+5 for type real, or false for type Boolean), variables of type T, function designators oftype T (interpreted following 3·8 and 3·9 above), and general expressions of type T enclosed in-parentheses. In addition to these primaries there are others which result from operations on expressions of types different from T. Thus, as in ALGOL 60, relations of equality or inequality between arithmetic expressions are primaries of type Boolean, having value either true or false. 3.13. As in ALGOL 60, a Boolean expression B and two expressions E and F of the same type T can be combined to form a conditional expression if B then E else F which is also oftype T. 3.14. Any actual list of primary expressions of type T, written down with commas between them, constitutes an expression oftype T list whose value is the list of the values ofthese expressions taken in that order. The comma can be regarded as a list-forming operator.
3.15. If Uis any operation sign which operates on two operands of type T, producing a result of type R, then U may be written between primary expressions of type T list and will yield the result of type R list which is obtained by operating on corresponding components ofthe two lists oftype T (resulting from evaluating these primary expressions). Evidently this requires that the two lists be ofequal length. We also permit U tobe written between an expression oftype T and one oftype Tlist yielding the result of type R list which is obtained by operating on successive components of the list with the same operand of type T. If U operates on a single operand of type T, producing a result of type R,
The Description of Computing Processes
11
then U may operate on a list ofoperands of type T and will produce a list of results of type R i.e. a result of type R list. These facilities correspond to the suggestions of R. W. Hockney in the particular case of matrix operations (Ref. 3). 3.16. If E is any expression of type name, then
v (E) is an expression whose value is the value of the value ofE. The script v is an operator indicating one further step of evaluation (cf 3.3 above).
3.17. Indices, names andlists An index is used as an address of a component within a list, the first component having address 1. The ability to assign a value to a particular component ofa list without disturbing the other components implies the ability to name that cornponent. This name is derived from the name ofthe list and an index value, and is in fact the only case of a name which is not explicitly present as an identifier in the program. We thus regard the expression
L [1] as an expression of type name which names the ith component of l, where i is the value of the expression I of type index and l is the value of the expression L of type list. It is important that L is not here to be evaluated completely. The process intended is the evaluation of I to get i, then evaluation of L to get the name of a list l, and finally the formation ofa name ofthe ith component of l. If L [I] is on the left of an assignment statement the evaluation stops here. Ifit forms part ofa larger expression the selected component of l may itselfbe used to continue evaluating that expression, so that one further step of evaluation is involved. Multidimensional arrays are represented as lists oflists and correspond to the case where the above component of l is itself a list. If} is the value of an expression] of type index, and L [I] is of type list name, then L [1] [J] is an expression of type name whose value is a name of the}th component of the ith component of the list oflists named by the value of L. The expressions 1 and] areto be evaluated in that order, and the resulting list ofindices used with the name of the list oflists to form a name of the selected component. The same process is expressed by L[I,]]
where an explicit list of expressions of type index is to be evaluated.
12
M. Woodger
Since names may be stored as values, assigned to variables of type name, it is possible to separate the selection process from the use of the resulting name. This can be used to advantage in some matrix processes. 3.18. Constants Constants oftype real, integer or Boolean are expressed as in ALGOL 60. A constant oftype index is simply an unsigned integer other than zero. A constant of type syznbol is represented as any basic symbol (including the 'space' symbol U if necessary) enclosed in string quotes (r I). An identifier which is used as a label is a constant of type label, a subtype of naxne. Other identifiers used in the program are constants of other subtypes of name, according to their declarations. A constant of type T list is simply an explicit list ofconstants oftype T, written with separating commas and enclosing parentheses. 3.19. Strings
Strings of basic symbols are represented as lists of constant values oftype symbol, and the convention is used that a list such as
Ucl, raJ, rsJ, reI,
(UI, (XI,
r> \ r-I, (4 1)
can be abbreviated to (case uX > -41 In general, the occurrence of more than one symbol between string quotes indicates a list of this type. The type name 'symbol list' could be abbreviated to 'string'. 3.20. Labels As in ALGOL 60, an identifier attached as label to a particular statement in the program specifies the use of that identifier, within the block to which that statement belongs, as a name of that statement. This is like a declaration which is not in a block head. A label expression is what in ALGOL 60 is called a designational expression. It is of type narne, subtype label, since its value is an actual label, i.e. an identifier used as such in a block enclosing the piece of program where the expression appears. (This value may be assigned to a variable of type label.) A switch is a name of a list of label expressions, and is defined by an expression declaration. It may be used with an index as a label expression, as a switch designator in ALGOL 60, but it may also be used alone as an expression of type label list.
The Description ofComputing Processes
13
The general form of a 'go-to' statement is
gotoL where L is any label expression, which may in particular be a constant (an actual label), or a variable of type label (which is then to be evaluated). IV. DISCUSSION
4.1. The above suggestions are admittedly incomplete. They stop short ofa detailed syntax, and a full set of operations useful in widely occurring contexts. The reason for this is that, whereas it is hoped that the proposals given are sufficiently general and fundamental to be strong candidates for adoption in a general-purpose programming language, it appears that elaborations in a variety oflikely directions would be governed more by the kind of application intended, and an arbitrary choice among the many possibilities would have to be made. Thus if list processing per se were the main application, then an arbitrarily extended set of subtypes oflist might be required, probably allowing list components of differing types. If processing ofstrings ofbinary digits in general is to be a chiefconsideration, then these may be regarded either as oftype symbol list or of type Boolean list (depending on the interpretation) and a suitable set of operators has to be defined. It is evidently undesirable that a translator be equipped to deal with all such specialized fields of application simultaneously, unless it happens that a common simple set of operations will suffice, on account of the size of the program. A detailed syntax is best left until the semantic constituents of the language are chosen, to avoid using clumsy constructions for commonly occurring operations. 4.2. The above treatment has dealt with the most natural form ofsynthesis of compound forms of data from their constituents, namely as lists, but has not provided for analysis of values oftype real, integer or index into their constituents. Operations on the constituent digits of integers are not generally required, but it frequently happens that a real or floating-point number has to be treated as composed of two numbers, namely its exponent e and mantissa m, with e an integer and Im/ ~ 1. In that the mantissa is represented to a fixed number N of digits (binary or decimal), it may be treated as an integer oflimited size N digits, and the associated exponent then becomes e-N. We could therefore treat reals as of type integer list (2), and interpret the usual arithmetic operations as producing 'normalized' lists ofthis form, i.e. lists L such that the integer L [2] is either zero or lies between 2N -I and 2N in magnitude (base IO if decimal representation
14
M. Woodger
is used). The justification for not doing this can only be that a great many numerical processes do not require such analysis. 4.3. With the introduction of the simple notion ofa list whose components may themselves be lists, and an index used as ordinal number for counting the components, the concept of' array' is no longer required, and such aspects ofALGOL 60 as lower bounds ofindices and dynamic array declarations seem arbitrary and unnecessary. Whereas no convenient upper bound can be chosen for the magnitude of integers in general use, the magnitude ofindices whose explicit purpose is for counting in stored lists can readily be bounded in practice due to the finite extent of the store. A half-word commonly suffices to store an index value. 4.4. Lists have been distinguished as affixed or variable length. The way of managing variable length lists in practice will depend upon the main applications intended, but could be via a 'free storage list' as in the LISP system (Ref. 4), where the list structures are effectively chains of indirect addressing references terminated by recognizable 'atoms'. For applications involving more restricted variations it might be adequate to combine a fixed maximum storage reservation at declaration time: with automatic extension by a fixed amount on subsequent overstepping of the currently allocated space. Such a system preserves as far as possible the principle of storing successivelist components in successivestorage locations or blocks of locations. I t is worth remarking that integers are already stored aslistsofdigits, and treated as offixed length (one word), so that multiple precision working can be described either as operations upon lists of digits exceeding the standard length, or alternatively as rather more artificial operations upon pairs (or longer lists) ofintegers. 4.5. The description of the effect of procedure calls has been simplified through the use of expression declarations (which are useful abbreviatory facilities in their own right) and by allowing declarations for variables to be combined with initial assignment of values, calculated at the moment of entry to the block or procedure body. A description in terms of a substitution operation which does not in fact take place is thereby avoided. Expression declarations have been suggested at various times by different people, under the name 'function declaration' (Ref. 5). The present proposal effectively includes as special cases the' equivalence declaration' and the' constant declaration' (Ref. 6).
The Description of Computing Processes
15
4.6. The 'for statement' of ALGOL 60 embodied the essential features of the present sequence statement (Section 3.11) but in a restricted form. The 'step-until' element represented a sequencing clause which produced a list of values to be assigned to the controlled variable each time it was invoked (i.e. at each test for termination), but these had to be in arithmetic progression. The arithmetic expression elements in a 'for list' are retained, but the' while element' is separated from the annexed arithmetic expression of ALGOL 60 in order that it may be combined, as required, with the other elements. This is often needed in practice. The controlled variable of the 'for statement' of ALGOL 60 has been replaced by a list offormal parameters, thus recognizing the bound na ture of the variable and extending it to a flexibility equivalent to that of the information supplied at calls ofa procedure. The 'for list' of ALGOL 60 which involved expressions evaluated at each cycle corresponds here to a 'for' list with actual parameter expressionscalled by name; call by value is also possible, in which case a list of values is produced at commencement of the sequence statement. The requirement for simultaneous sequencing of several variables has been expressed before. V.ACKNOWLEDGEMENTS
I wish to express my thanks to Dr. E. W. Dijkstra of the Mathematical Centre, Amsterdam, for his helpful comments which clarified my understanding of process description. The work described above has been carried out as part of the research programme of the National Physical Laboratory, and this paper is published by permission of the Director of the Laboratory. REFERENCES 1. DIJKSTRA, E. W., 'Recursive Programming'. Num. Math., 2, 5 (Oct. 1960). 2. NAUR, P. (ed.), 'Report on the Algorithmic Language ALGOL 60'. Num. Math. 2, 106-136 (1960). 3. HaCKNEY, R. W., 'A.B.S. 12 ALGOL'. Computer]. (Feb. 1962). 4. MCCARTHY,].,'The LISP Programming System ', Quarterly Progress Report No. 53, Research Laboratory of Electronics, Massachusetts Institute of Technology (April15, 1959). 5. VAN WIJNGAARDEN, A. and DIJKSTRA, E. W., ALGOL Bulletin 7.34.2 (Oct. 1959). 6. ALGOL Bulletin 4.10 and 4.7 (Aug. 1959).