## SICP Collections

### 1` `Introduction

This package contains two collections.

The sicp collection contains a #lang sicp language ideal for studying the book "Structure and Interpretation of Computer Programs" by Gerald Jay Sussman and Hal Abelson. The book is usually referred to simply as SICP.

The second sicp-pict collection contains the picture language used in SICP. The non-standard primitives cons-stream and amb are also provided.

### 2` `Installation

Use DrRacket to install the sicp package like this:

Open the Package Manager: in DrRacket choose the menu "File" then choose "Package Manager...".

In the tab "Do What I Mean" find the text field and enter: "sicp"

Finally click the "Install" button.

Test it. Make sure DrRacket has "Determine language from source" in the bottom left corner. Write the following program and click run:

#lang sicp

(inc 42)

The expected output is 43.

### 3` `Introduction to the #lang sicp language

The programs in the book are written in (a subset of) the programming language Scheme. As the years have passed the programming language Scheme has evolved. The language #lang sicp provides you with a version of R5RS (the fifth revision of Scheme) changed slightly in order for programs in SICP to run as is.

The changes are as follows:

The identifers true, false, and, nil are provided with values #t, #f, and, '() respectively.

(define (identity x) x) the identity funciton |

(define (inc x) (+ x 1)) increment |

(define (dec x) (- x 1)) decrement |

There are no streams in R5RS, so the sicp language provides the primitives cons-stream and stream-null? that respectively constructs a stream and tests whether a stream is the null stream. The null-stream is provided as the-empty-stream.

Finally the function runtime is provided. It gives you the current time measured as the number of seconds passed since a fixed beginning.

To use the sicp language simply use #lang sicp as the first line of your program. If you need to use Racket libraries, then use #%require (Note: R5RS has no require so in order not to break any programs using the name require to other things, the name #%require is used instead.

### 4` `Introduction to the SICP Picture Language

The SICP Picture Language is a small language for drawing pictures. It shows the power of data abstraction and closure. The picture language stems from Peter Henderson’s 1982 paper "Functional Geometry" and was included by Hal Abelson in "Structure and Interpretation of Computer Programs".

Before using this package, read section 2.2.4 of SICP, which is an excellent introduction to the ideas of the picture language. This manual is meant as a reference guide.

Peter Henderson has written an updated version of "Functional Geometry", which explains how to construct the Escher fish image.

Note: The primitives cons-stream and amb needed in other chapters of SICP are also provided.

### 5` `Reference

The basic concept of the picture language is a painter. A painter draws it’s image (shifted and scaled) within a frame given by a parallelogram. Painters can be combined to construct new painters.

### 6` `Example

Using sicp-pict from a "#lang sicp" program:

#lang sicp |

(#%require sicp-pict) |

(paint einstein) |

Using sicp-pict from a "#lang racket" program:

#lang racket |

(require sicp-pict) |

(paint einstein) |

From the REPL:

> (require sicp-pict) > (paint (number->painter 0)) > (paint diagonal-shading) > (paint-hires (below (beside diagonal-shading (rotate90 diagonal-shading)) (beside (rotate270 diagonal-shading) (rotate180 diagonal-shading)))) > (paint einstein)

### 7` `Vectors

A mathematical vector is called a vect here, in order to avoid confusion with the builtin vectors of Scheme.

procedure

(vector-xcor v) → number?

v : vect?

procedure

(vector-ycor v) → number?

v : vect?

procedure

(vector-add v w) → vect?

v : vect? w : vect?

procedure

(vector-sub v w) → vect?

v : vect? w : vect?

procedure

(vector-scale s v) → vect?

s : number? v : vect?

### 8` `Frames

^ |

| frame edge2 vector |

| |

_|__________> |

/| frame edge1 vector |

/ |

/ |

/ frame origin pointer |

procedure

(make-frame origin edge1 edge2) → frame?

origin : vect? edge1 : vect? edge2 : vect

procedure

(frame-origin f) → vect?

f : frame?

procedure

(frame-edge1 f) → vect?

f : frame?

procedure

(frame-edge2 f) → vect?

f : frame?

procedure

(make-relative-frame origin corner1 corner2) → (frame? -> frame?)

origin : vect? corner1 : vect? corner2 : vect?

procedure

(frame-coord-map f) → (vect? -> vect?)

f : frame?

The frame coordinate map is returned by frame-coord-map. E.g. these expression return the same value:

((frame-coord-map a-frame) (make-vect 0 0))

(frame-origin a-frame)

### 9` `Segments

A pair of vectors determines a directed line segment - the segment running from the endpoint of the first vector to the endpoint of the second vector.

procedure

(make-segment from to) → segment?

from : vect? to : vect?

procedure

(segment-start s) → vect?

s : segment?

procedure

(segment-end s) → vect?

s : segment?

### 10` `Primitive Painters

Painters take a frame and draw an image, transformed to fit inside the frame.

from a constant: number->painter

from a list of line segments: segment->painter

form a procedure: procedure->painter

from a picture: picture->painter

procedure

(number->painter color) → painter?

color : 0..255

procedure

(segments->painter los) → painter?

los : list-of-segment?

procedure

(procedure->painter p) → painter?

p : procedure?

Then to plot a point p in the target frame, we find the inverse image T^-1(p) of p under the transformation that maps the unit square to the target, and find the value of f at T-1(p).

procedure

(picture->painter p) → painter?

p : picture

Given a point p in the target frame, we compute T^-1(p) where T is the transformation that takes the picture frame to the target frame, and find the picture value at the closest integer point.

procedure

(load-painter filename) → painter?

filename : path?

### 11` `Higher Order Painters

procedure

(transform-painter origin corner1 corner2)

→ (painter? -> painter?) origin : vect? corner1 : vect? corner2 : vect?

Transform-painter will given an origin and two corners, return a function that takes a painter as argument and returns a transformed painter.

procedure

(flip-horiz p) → painter?

p : painter

procedure

(flip-vert p) → painter?

p : painter

procedure

(rotate90 p) → painter?

p : painter

procedure

(rotate180 p) → painter?

p : painter

procedure

(rotate270 p) → painter?

p : painter

procedure

(beside p1 p2) → painter?

p1 : painter p2 : painter

procedure

(below p1 p2) → painter?

p1 : painter p2 : painter

procedure

(superpose p1 p2) → painter?

p1 : painter p2 : painter

### 12` `Simple Builtin Painters

The following painter values are buitin:

black, white and gray Fills the frame with black (0), white (255) or gray (150).

diagonal-shading Fills the frame with a shades of gray. The color transition goes from black in the upper left corner is black, to gray in the bottom right corner.

einstein Draws an image of Einstein.

### 13` `Painting

The procedures paint and paint-hi-res takes a painter as input and return a snip containing the painter’s image. A snip is an image that DrScheme can display automatically.

procedure

(paint p) → snip?

p : painter?

procedure

(paint-hi-res p) → snip?

p : painter?

### 14` `Authors

Abelson & Sussman: Structure and Interpretation of Computer Programs.

Daniel Coore: Original MIT Scheme code.

Mike Sperber: PLT port.

Jens Axel Søgaard: Documentation.

Javier Olaechea: Fixed amb.

Neil Van Dyke: The SICP language. Maintained the sicp package for years.

### 15` `Other

See also the readme.html from the SICP web-site for more documentation and exercises.

Peter Henderson’s "Functional Geometry".