Revision of 2.2.4 Example: A Picture Language from 17 July 2009 - 11:25pm
The revisions let you track differences between multiple versions of a post.
This section presents a simple language for drawing pictures that illustrates the
power of data abstraction and closure, and also exploits higher-order procedures in
an essential way. The language is designed to make it easy to experiment with patterns
such as the ones in figure 2.9, which are
composed of repeated elements that are shifted and scaled. In this language, the data objects being combined are represented as procedures rather than as list structure.
cons, which satisfies the closure property,
allowed us to easily build arbitrarily complicated list structure, the operations in this language, which also satisfy the closure property, allow us to easily build
arbitrarily complicated patterns.
The picture language
When we began our study of programming in section 1.1, we emphasized the importance of describing a language by focusing on the language’s primitives, its means of combination, and its means of abstraction. We’ll follow that framework here.Part of the elegance of this picture language is that there is only one kind of element, called a painter. A painter draws an image that is shifted and scaled to fit within a designated parallelogram-shaped frame. For example, there’s a primitive painter we’ll call
wavethat makes a crude line drawing, as shown in figure 2.10. The actual shape of the drawing depends on the frame — all four images in figure 2.10 are produced by the same
wavepainter, but with respect to four different frames. Painters can be more elaborate than this: The primitive painter called
rogerspaints a picture of MIT’s founder, William Barton Rogers, as shown in figure 2.11. The four images in figure 2.11 are drawn with respect to the same four frames as the
waveimages in figure 2.10.
To combine images, we use various operations that construct new painters from given painters. For example, the
beside operation takes two painters and produces a new, compound painter that draws the first painter’s image in the left half of the frame and the second painter’s image in the right half of the frame.
below takes two painters and produces a compound painter that draws the first painter’s image below the second
painter’s image. Some operations transform a single painter to produce
a new painter. For example,
flip-vert takes a painter and
produces a painter that draws its image upside-down, and
flip-horiz produces a painter that draws the original painter’s image left-to-right reversed.
Figure 2.12 shows the drawing of a painter called
wave4 that is built up in two stages starting from
(define wave2 (beside wave (flip-vert wave))) (define wave4 (below wave2 wave2))
(define wave2 (define wave4
In building up a complex image in this manner we are exploiting the
fact that painters are closed under the language’s means of
below of two painters is
itself a painter; therefore, we can use it as an element in making
more complex painters. As with building up list structure using
cons, the closure of our data under the means of combination is
crucial to the ability to create complex structures while using only a
Once we can combine painters, we would like to be able to abstract
typical patterns of combining painters.
We will implement the painter operations as Scheme procedures.
This means that we don’t need a special abstraction mechanism
in the picture language:
Since the means of combination
are ordinary Scheme procedures, we automatically have the capability
to do anything with painter operations that we can do with
For example, we can abstract the pattern in
(define (flipped-pairs painter)
(let ((painter2 (beside painter (flip-vert painter))))
(below painter2 painter2)))
wave4 as an instance of this pattern:
(define wave4 (flipped-pairs wave))
(define (right-split painter n)
(if (= n 0)
(let ((smaller (right-split painter (- n 1))))
(beside painter (below smaller smaller)))))
right-split n corner-split n
(define (corner-split painter n)
(if (= n 0)
(let ((up (up-split painter (- n 1)))
(right (right-split painter (- n 1))))
(let ((top-left (beside up up))
(bottom-right (below right right))
(corner (corner-split painter (- n 1))))
(beside (below painter top-left)
(below bottom-right corner))))))
(right-split wave 4) (right-split rogers 4)
(corner-split wave 4) (corner-split rogers 4)
By placing four copies of a
appropriately, we obtain a pattern called
rogers is shown in
(define (square-limit painter n)
(let ((quarter (corner-split painter n)))
(let ((half (beside (flip-horiz quarter) quarter)))
(below (flip-vert half) half))))
When MIT was established in 1861, Rogers was elected its first president. Rogers espoused an ideal of “useful learning” that was different from the university education of the time, with its overemphasis on the classics, which, as he wrote, “stand in the way of the broader, higher and more practical instruction and discipline of the natural and social sciences.” This education was likewise to be different from narrow trade-school education. In Rogers’s words:
The world-enforced distinction between the practical and the scientific worker is utterly futile, and the whole experience of modern times has demonstrated its utter worthlessness.
Rogers served as president of MIT until 1870, when he resigned due to ill health. In 1878 the second president of MIT, John Runkle, resigned under the pressure of a financial crisis brought on by the Panic of 1873 and strain of fighting off attempts by Harvard to take over MIT. Rogers returned to hold the office of president until 1881.
Rogers collapsed and died while addressing MIT’s graduating class at the commencement exercises of 1882. Runkle quoted Rogers’s last words in a memorial address delivered that same year:
In the words of Francis A. Walker (MIT’s third president):
“As I stand here today and see what the Institute is, … I call to mind the beginnings of science. I remember one hundred and fifty years ago Stephen Hales published a pamphlet on the subject of illuminating gas, in which he stated that his researches had demonstrated that 128 grains of bituminous coal — ”
“Bituminous coal,” these were his last words on earth. Here he bent forward, as if consulting some notes on the table before him, then slowly regaining an erect position, threw up his hands, and was translated from the scene of his earthly labors and triumphs to “the tomorrow of death,” where the mysteries of life are solved, and the disembodied spirit finds unending satisfaction in contemplating the new and still unfathomable mysteries of the infinite future.
All his life he had borne himself most faithfully and heroically, and he died as so good a knight would surely have wished, in harness, at his post, and in the very part and act of public duty.