This diagram shows the family tree of all the “Major Programming Languages” and all those that influenced or were influenced by them. Both the selection of what constitutes a “major” programming language and which languages influenced which were determined by Wikipedia and are limited in their accuracy by the articles there on the various languages.
Data as Procedures with No Data
Further to my post on data as procedures, I’ve translated to Common Lisp the implementation of cons, car and cdr as procedures with no data, not even numbers.
This comes from lecture 5b of the Structure and Interpretation of Computer Programs video series, with the necessary (funcall) adjustments for Common Lisp.
(defun my-cons (x y)
(lambda (m) (funcall m x y)))
(defun my-car (x)
(funcall x (lambda (a d) a)))
(defun my-cdr (x)
(funcall x (lambda (a d) d)))
(print (my-car (my-cons 35 47)))
(print (my-cdr (my-cons 77 22)))
Output is:
35 22
Data as Procedures
I was watching lecture 2b of the SICP lectures and it shows an implementation of cons, car and cdr in Scheme as procedures. So I thought I’d write the equivalent in Common Lisp to test my understanding:
(defun my-cons (a b)
#'(lambda (c)
(cond ((= c 0) a)
((= c 1) b))))
(defun my-car (x) (funcall x 0))
(defun my-cdr (x) (funcall x 1))
(print (my-car (my-cons 'gold 'silver)))
(print (my-cdr (my-cons 'everything 'nothing)))
Output is:
$ clisp pairs.lisp GOLD NOTHING
Crazy. “Constructed out of thin air”, as Abelson says.
The scheme implementation is definitely nicer. See What Is Meant by Data? Scheme has only one namespace so there’s no need for the #' and funcall clutter.

