Besides this first report (AIM-001), some of the reports following it in the next months are at least as important, by introducing other essential features of LISP and of many later languages:
1958-10: AIM-003 (the special form "maplist", i.e. a kind of "forall" iteration)
1958-10: AIM-004 (anonymous function definitions using "lambda"; the special form "select", which already at that early date had better syntax and semantics than the "switch" or "case" statements of later languages; the special form "search")
1959-03-13: AIM-008 (the special form "quote"; the special form "label", for defining anonymous recursive functions; also the special forms "and" and "or", a.k.a. McCarthy AND and McCarthy OR, inherited by many languages, including C)
It doesn't fully explain it, but drops some hints:
"The other main advantage of the algebraic notation for list structure processing was first noticed by Gelernter."
That's one of the authors of the Fortran-compiled List-processing Language (FLPL) in which thef unctions XCARF and XCDRF were introduced.
MacCarthy drops a hint that he actually had something to do with Gelernter's work and his choices:
"Algebraic notation for list processing is not used by
Net'Jell, Simon and Shaw, pelhaps beaause to do so is most
convenient when a compiler is available, but is used by
Gelernter in the geometry program. This was accomplished
(on the advice of the present author) by using the Fortran
compiler together with a set of machine language coded
functions for handling the primitive list processes that
go from one element of a list to the next"
CAR = Contents of Address Register, corresponding to the head element of a list.
CDR = Contents of Decrement Register, corresponding to a pointer to the "rest" of a list, i.e. to a machine word containing the next link in the list.
This is hinted at in the paper by this:
> "Each computer word of a list in addition to containing a datum also contains the address of the word containing the next element of the list. 0 for the address of the next element indicates the last element. If one element of an expression is a subexpression the word corresponding to this element contains the address of the word containing the first element of the subexpression. In the IBM 704 or 709 whose 36 bit word is divided (for the convenient use of certain machine instructions) into two 15 bit parts (address and decrement) and two 3 bit parts (prefix and tag) lists are represented by storing in the decrement part of a word the address (in our system actually the complement of the address) of the next word or the list."
The choice of names is rather implementation-specific (and if memory serves, this may have been a choice by the person who coded the original LISP interpreter, not McCarthy himself.) But the mapping of the abstract concept of a linked list to a usable machine representation, built into the core of a programming language, was impressive. FORTRAN and COBOL had nothing like this.
> Despite its old age, Lisp remains mysterious to many of its admirers. The mysteries on one hand fascinate the language, on the other hand also obscure it. Following Stoyan but paying attention to what he has neglected or omitted, in this first essay of a series intended to unravel these mysteries, we trace the development of Lisp back to its origin, revealing how the language has evolved into its nowadays look and feel. The insights thus gained will not only enhance existent understanding of the language but also inspires further improvement of it.
I like how the McCarthy's paper maps the fundamental operations to machine instructions and memory model. It's like something you can actually implement.
Besides this first report (AIM-001), some of the reports following it in the next months are at least as important, by introducing other essential features of LISP and of many later languages:
1958-10: AIM-003 (the special form "maplist", i.e. a kind of "forall" iteration)
1958-10: AIM-004 (anonymous function definitions using "lambda"; the special form "select", which already at that early date had better syntax and semantics than the "switch" or "case" statements of later languages; the special form "search")
1959-03-13: AIM-008 (the special form "quote"; the special form "label", for defining anonymous recursive functions; also the special forms "and" and "or", a.k.a. McCarthy AND and McCarthy OR, inherited by many languages, including C)
Does anybody attempt to re-implment each variant of pre-LISP described in these reports? Even if it just for educational/historical purposes?
https://t3x.org/lispxv/index.html
If you ever wondered why Lisp has CAR and CDR, this explains it.
It doesn't fully explain it, but drops some hints:
"The other main advantage of the algebraic notation for list structure processing was first noticed by Gelernter."
That's one of the authors of the Fortran-compiled List-processing Language (FLPL) in which thef unctions XCARF and XCDRF were introduced.
MacCarthy drops a hint that he actually had something to do with Gelernter's work and his choices:
"Algebraic notation for list processing is not used by Net'Jell, Simon and Shaw, pelhaps beaause to do so is most convenient when a compiler is available, but is used by Gelernter in the geometry program. This was accomplished (on the advice of the present author) by using the Fortran compiler together with a set of machine language coded functions for handling the primitive list processes that go from one element of a list to the next"
I think the main reason is car/cdr permits elegant recursive solutions to problems.
more the names then the functions themselves
For those who may not be familiar:
CAR = Contents of Address Register, corresponding to the head element of a list.
CDR = Contents of Decrement Register, corresponding to a pointer to the "rest" of a list, i.e. to a machine word containing the next link in the list.
This is hinted at in the paper by this:
> "Each computer word of a list in addition to containing a datum also contains the address of the word containing the next element of the list. 0 for the address of the next element indicates the last element. If one element of an expression is a subexpression the word corresponding to this element contains the address of the word containing the first element of the subexpression. In the IBM 704 or 709 whose 36 bit word is divided (for the convenient use of certain machine instructions) into two 15 bit parts (address and decrement) and two 3 bit parts (prefix and tag) lists are represented by storing in the decrement part of a word the address (in our system actually the complement of the address) of the next word or the list."
The choice of names is rather implementation-specific (and if memory serves, this may have been a choice by the person who coded the original LISP interpreter, not McCarthy himself.) But the mapping of the abstract concept of a linked list to a usable machine representation, built into the core of a programming language, was impressive. FORTRAN and COBOL had nothing like this.
Reposting my now very old comment https://news.ycombinator.com/item?id=10502434 :
> Herbert Stoyan's historical work on early Lisp http://www.mcjones.org/dustydecks/archives/2010/07/29/185/ https://web.archive.org/web/20050617031004/http://www8.infor... is probably worth reading if one is seriously interested. (I haven't read much of it myself yet.) McCarthy praised Stoyan's work as better than his own 1979 HOPL paper ( http://www-formal.stanford.edu/jmc/history/lisp/lisp.html ): "Stoyan's reading of the early LISP documents gives a more accurate picture than my own memories turned out to have given." http://www-formal.stanford.edu/jmc/history/
> (As a side-note, I'm pretty sure that the broken, Wayback-beating link to "Lisp references according to Miller" on McCarthy's page is to this http://www.ai.sri.com/~delacaze/alu-site/alu/table/Lisp-Hist... document by Kent Pitman and Brad Miller (see http://www.ai.sri.com/~delacaze/alu-site/alu/table/history.h... ).)
From 2015-2018, "The Mysteries of Lisp -- I: The Way to S-expression Lisp" by Hong-Yi Dai https://arxiv.org/abs/1505.07375 ( https://news.ycombinator.com/item?id=31153702 )
> Despite its old age, Lisp remains mysterious to many of its admirers. The mysteries on one hand fascinate the language, on the other hand also obscure it. Following Stoyan but paying attention to what he has neglected or omitted, in this first essay of a series intended to unravel these mysteries, we trace the development of Lisp back to its origin, revealing how the language has evolved into its nowadays look and feel. The insights thus gained will not only enhance existent understanding of the language but also inspires further improvement of it.
I like how the McCarthy's paper maps the fundamental operations to machine instructions and memory model. It's like something you can actually implement.
Subset of Lisp 1.5 https://t3x.org/lispxv/index.html