Teachpacks for How to Design Programs

# Arrows

### arrow.ss

A shape is a class of data for which `move` and `draw` operations can be drawn.

The teachpack `arrow.ss` implements controller for moving shapes across a canvass. It provides three operations:

- `control-left-right : shape number move draw -> true` :
  It consumes a shape, a number, a `move` function and a `draw` function. The move function consumes a number and a shape and re-draws the shape on some canvas and produces a shape that is translated by N pixels left or right.
- `control-up-down : shape number move -> true` :
  It is like `control-left-right` but controls movements by N pixels up or down.
- `control : shape number move-lr move-ud -> true` :
  It consumes a shape, a number, two `move` functions, and a draw function. The `move` functions consume a number and a shape and re-draw the shape on some canvas and produces a shape that is translated by N pixels left or right and up or down, respectively.

  Example:

      ;; A shape is a structure:
      ;;   (make-posn num num)

      ;; RAD : the radius of the simple disk moving across a canvas
      (define RAD 10)

      ;; move : number shape -> shape or false
      ;; to move a shape by delta according to translate
      ;; effect: to redraw it
      (define (move delta sh)
        (cond
          [(and (clear-solid-disk sh RAD)
                (draw-solid-disk (translate sh delta) RAD))
           (translate sh delta)]
          [else false]))

      ;; translate : shape number -> shape
      ;; to translate a shape by delta in the x direction
      (define (translate sh delta)
        (make-posn (+ (posn-x sh) delta) (posn-y sh)))

      ;; draw-it : shape -> true
      ;; to draw a shape on the canvas: a disk with radius
      (define (draw-it sh)
        (draw-solid-disk sh RAD))

      ;; TESTS:

      ;; this creates the canvas
      (start 100 50)

      ;; this creates the controller GUI
      (control-left-right (make-posn 10 20) 10 move draw-it)