Typed Structures

Defining new structures

A new structure need type information just like a function. There are also some incantations you will want to use.

  • #:transparent - Always include this.
  • #:type-name - Usually include, should be name of struct with a capital letter at the start.

Example:

(define-struct ship ([ name : String ]
                     [ pos : (Listof Posn) ])
                    #:transparent
                    #:type-name Ship)

Functions using structures

A function bn that takes in a ship and produces an image of a box around the name would be written like this:

(define (bn [s : Ship]) : Image
  (frame (text (ship-name s) 24 "black")))

Copying Structures

Racket has a method called struct-copy for copying a structure and changing some of the entries.

 (struct-copy STRUCT-NAME VARIABLE [field NEW-VALUE])

Example:

(define a-ship1 (make-ship "Dingy" (list (make-posn 5 2))))
(define a-ship2 (struct-copy ship a-ship1 [name "Sailboat"]))

Colors

It can be tricky to write the limit function that restricts a number to the range 0 to 255 for use in a color.

(define (limit [n : Integer])
  : Byte
  (min 255 (max 0 n)))

If you need to handle real number inputs, add in (round (inexact->exact n)).

Trivia: the order of the inputs matters, check the type signature of max.