commit 6b282c7b3614bf0b28cccf066dbc93c934ed8e47
parent 65f7a554be09fd8b603892825b86fe032c4fd00b
Author: Georges Dupéron <georges.duperon@gmail.com>
Date: Wed, 21 Jun 2017 19:20:58 +0200
Started new .travis.yml
Diffstat:
| M | .travis.yml | | | 109 | +++++++++++++++++++++---------------------------------------------------------- |
| M | scribblings/tr.scrbl | | | 7906 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ |
2 files changed, 7332 insertions(+), 683 deletions(-)
diff --git a/.travis.yml b/.travis.yml
@@ -1,95 +1,42 @@
language: c
-
-# Based from: https://github.com/greghendershott/travis-racket
-
-# Optional: Remove to use Travis CI's older infrastructure.
sudo: false
env:
global:
- # Supply a global RACKET_DIR environment variable. This is where
- # Racket will be installed. A good idea is to use ~/racket because
- # that doesn't require sudo to install and is therefore compatible
- # with Travis CI's newer container infrastructure.
+ # RACKET_DIR is an argument to install-racket.sh
- RACKET_DIR=~/racket
+ - PATH="$RACKET_DIR/bin:$PATH"
matrix:
- # Supply at least one RACKET_VERSION environment variable. This is
- # used by the install-racket.sh script (run at before_install,
- # below) to select the version of Racket to download and install.
- #
- # Supply more than one RACKET_VERSION (as in the example below) to
- # create a Travis-CI build matrix to test against multiple Racket
- # versions.
- #- RACKET_VERSION=6.0
- #- RACKET_VERSION=6.1
- #- RACKET_VERSION=6.1.1
- #- RACKET_VERSION=6.2
- #- RACKET_VERSION=6.3
- #- RACKET_VERSION=6.4
- #- RACKET_VERSION=6.5
- #- RACKET_VERSION=6.6
- #- RACKET_VERSION=6.7
- #- RACKET_VERSION=6.8
- RACKET_VERSION=6.9 DEPLOY=true
- #- RACKET_VERSION=HEAD
cache:
directories:
- $HOME/.racket
-addons:
- apt:
- packages:
- - texlive-latex-base
- - texlive-fonts-extra
- - texlive-fonts-recommended
- - texlive-latex-extra
- - latex-xcolor
- #- graphviz
-
-matrix:
- allow_failures:
-# - env: RACKET_VERSION=HEAD
- fast_finish: true
-
before_install:
-- git clone https://github.com/greghendershott/travis-racket.git ~/travis-racket
-- cat ~/travis-racket/install-racket.sh | bash # pipe to bash not sh!
-- export PATH="${RACKET_DIR}/bin:${PATH}" #install-racket.sh can't set for us
-- echo "LaTeX extra packages:"
-- latex_home=$(kpsewhich -var-value=TEXMFHOME)
-- curl -L -o newunicodechar.ins http://mirrors.ctan.org/macros/latex/contrib/newunicodechar/newunicodechar.ins
-- curl -L -o newunicodechar.dtx http://mirrors.ctan.org/macros/latex/contrib/newunicodechar/newunicodechar.dtx
-- latex newunicodechar.ins
-- mkdir -p "$latex_home/tex/latex/newunicodechar"
-- mv newunicodechar.sty "$latex_home/tex/latex/newunicodechar"
-
-install:
- - raco pkg remove -j 2 --no-trash phc-thesis || true # Attempt to remove already cached version.
- - raco pkg update -j 2 --all --scope user
-# - raco pkg install -j 2 --deps search-auto phc-adt # Help a bit by populating the cache.
- - raco pkg install -j 2 --deps search-auto
-# --no-setup
-# - (while ! test -e ~/done.txt; do sleep 10; echo -n '.'; done) & raco setup -v -j 2 --pkgs phc-thesis && touch ~/done.txt
-
-before_script:
-
-# Here supply steps such as raco make, raco test, etc. You can run
-# `raco pkg install --deps search-auto` to install any required
-# packages without it getting stuck on a confirmation prompt.
-script:
- echo "."
- - raco test -x -p phc-thesis
- - raco setup --check-pkg-deps --no-zo --no-launcher --no-install --no-post-install --no-docs --pkgs phc-thesis
- - rm -fr doc/
- - raco scribble --dest doc/phc-thesis --html --dest-name index ++main-xref-in --redirect-main https://docs.racket-lang.org/ --redirect https://docs.racket-lang.org/ scribblings/phc-thesis.scrbl
- - make
- - if test "x${DEPLOY:-}" = "xtrue"; then sh ./auto-push-gh-pages.sh; fi
- - du -hs ~/.racket
-
-#after_success:
-# - raco pkg install --deps search-auto cover cover-coveralls
-# - raco cover -b -f coveralls -d $TRAVIS_BUILD_DIR/coverage .
-
-#after_success:
-# - sh ./auto-push-master.sh
+- curl -L https://raw.githubusercontent.com/greghendershott/travis-racket/master/install-racket.sh | bash
+# - if $COV; then raco pkg install --deps search-auto doc-coverage cover cover-codecov; fi # or cover-coveralls
+
+jobs:
+ include:
+ - stage: phase1
+ install:
+ - echo hello > ~/.racket/hello
+ - echo "$TRAVIS_BUILD_ID" > ~/.racket/travis_build_id
+ script:
+ - ls -la $HOME
+ - tree ~/.racket
+ - stage: phase2
+ addons:
+ apt:
+ packages:
+ - texlive-latex-base
+ install:
+ - echo bye > ~/.racket/hello
+ - cat ~/.racket/hello
+ - if "$TRAVIS_BUILD_ID" != `cat ~/.racket/travis_build_id`; then travis_terminate 1; fi
+ script:
+ - ls -la $HOME
+ - tree ~/.racket
+ - mv ~/.racket ~/.racket-discard
+ - mkdir ~/.racket # clear the cache
diff --git a/scribblings/tr.scrbl b/scribblings/tr.scrbl
@@ -1,603 +1,7306 @@
-#lang scribble/manual
+#reader(lib"read.ss""wxme")WXME0108 ##
+#|
+ This file uses the GRacket editor format.
+ Open this file in DrRacket version 6.9.0.4 or later to read it.
-@require["util.rkt"
- (for-label (only-meta-in 0 typed/racket))
- scribble/example
- racket/string]
-@(use-mathjax)
+ Most likely, it was created by saving a program in DrRacket,
+ and it probably contains a program with non-text elements
+ (such as images or comment boxes).
-@(define tr-eval (make-eval-factory '(typed/racket)))
-
-@title[#:style (with-html5 manual-doc-style)
- #:version (version-text)
- #:tag "tr-chap"]{@|Typedracket|}
-
-We start this section with some history: Lisp, @emph{the} language with lots
-of parentheses, shortly following Fortran as one of the first high-level
-programming languages, was initially designed between 1956 and 1958, and
-subsequently implemented@~cite["McCarthyHistoryLisp"]. Dialects of Lisp
-generally support a variety of programming paradigms, including (but not
-limited to) functional programming and object-oriented programming (e.g. via
-CLOS, the Common Lisp Object System). One of the the most proeminent aspects
-of Lisp is homoiconicity, the fact that programs and data structures look the
-same. This enables programs to easily manipulate other programs, and led to
-the extensive use of macros. Uses of macros usually look like function
-applications, but, instead of invoking a target function at run-time, a macro
-will perform some computation at compile-time, and expand to some new code,
-which is injected as a replacement of the macro's use.
-
-The two main dialects of Lisp are Common Lisp and Scheme. Scheme follows a
-minimalist philosophy, where a small core is
-standardised@~cite["r5rs" "r6rs" "r7rs"] and subsequently extended via macros
-and additional function definitions.
-
-Racket, formerly named PLT Scheme, started as a Scheme implementation. Racket
-evolved, and the Racket Manifesto@~cite["racketmanifesto"] presents it as a
-``programming-language programming language'', a language which helps with the
-creation of small linguistic extensions as well as entirely new languages. The
-Racket ecosystem features many languages covering many paradigms:
-
-@itemlist[
- @item{The @racketmodname[racket/base] language is a full-featured programming
- language which mostly encourages functional programming.}
- @item{@racketmodname[racket/class] implements
- @seclink["classes" #:doc '(lib "scribblings/guide/guide.scrbl")]{an
- object-oriented system}, implemented atop @racketmodname[racket/base] using
- macros, and can be used along with the rest of the @racketmodname[racket/base]
- language.}
- @item{@racketmodname[racklog] is a logic programming language in the style of
- prolog. The Racket ecosystem also includes an implementation of
- @racketmodname[datalog].}
- @item{@seclink["top" #:doc '(lib "scribblings/scribble/scribble.scrbl")]{
- Scribble} can be seen as an alternative to @|LaTeX|, and is used to create
- the @seclink["top" #:doc '(lib "scribblings/main/start.scrbl")]{Racket
- documentation}. It also supports literate programming, by embedding chunks of
- code in the document which are then aggregated together. This thesis is
- in fact written using Scribble.}
- @item{@racketmodname[slideshow] is a @deftech{DSL} (domain-specific language)
- for the creation of presentations, and can be thought as an alternative to
- Beamer and SliTeX.}
- @item{@racketmodname[r5rs] and @racketmodname[r6rs] are implementations of
- the corresponding scheme standards.}
- @item{@seclink["top" #:doc '(lib "redex/redex.scrbl")]{Redex} is a
- @usetech{DSL} which allows the specification of reduction
- semantics for programming languages. It features tools to explore and test
- the defined semantics.}
- @item{@|Typedracket|@~cite["tobin-hochstadt_design_2008"
- "tobin-hochstadt_typed_2010"] is a typed variant of
- the main @racketmodname[racket] language. It is implemented as a macro which
- takes over the whole body of the program. That macro fully expands all other
- macros in the program, and then typechecks the expanded program.}
- @item{@seclink["top" #:doc '(lib "turnstile/scribblings/turnstile.scrbl")]{
- @|Turnstile|} allows the creation of new typed languages. It takes a
- different approach when compared to @|typedracket|, and threads the type
- information through assignments and special forms, in order to be able to
- typecheck the program during expansion, instead of doing so afterwards.}]
-
-In the remainder of this section, we will present the features of
-@|typedracket|'s type system, and then present formal semantics for a subset
-of those, namely the part which is relevant to our work.
-@other-doc['(lib "typed-racket/scribblings/ts-guide.scrbl")] and
-@other-doc['(lib "typed-racket/scribblings/ts-reference.scrbl")] provide good
-documentation for programmers who desire to use @|typedracket|; we will
-therefore keep our overview succinct and gloss over most details.
-
-@asection{
- @atitle{Overview of Typed Racket's type system}
-
- @asection{
- @atitle{Simple primitive types}
-
- @Typedracket has types matching Racket's baggage of primitive values:
- @racket[Number], @racket[Boolean], @racket[Char], @racket[String],
- @racket[Void]@note{The @racket[Void] type contains only a single value,
- @racket[#,(void)], and is equivalent to the @racketid[void] type in
- @|C-language|. It is the equivalent of @racketid[unit] of @CAML and
- @|haskell|, and is often used as the return type of functions which perform
- side-effects. It should not be confused with @racket[Nothing], the bottom
- type which is not inhabited by any value, and is similar to the type of
- @|haskell|'s @racketid[undefined]. @racket[Nothing] can be used for example
- as the type of functions which never return — in that way it is similar to
- @|C-language|'s @tt["__attribute__ ((__noreturn__))"].} and so on.
-
- @examples[#:label #f #:eval (tr-eval)
- (ann #true Boolean)
- 243
- "Hello world"
- #\c
- (code:comment "The void function produces the void value")
- (code:comment "Void values on their own are not printed,")
- (code:comment "so we place it in a list to make it visible.")
- (list (void))]
-
- For numbers, @|typedracket| offers a ``numeric tower'' of
- partially-overlapping types: @racket[Positive-Integer] is a subtype of
- @racket[Integer], which is itself a subtype of @racket[Number]. @racket[Zero],
- the type containing only the number 0, is a both a subtype of
- @racket[Nonnegative-Integer] (numbers ≥ 0) and of @racket[Nonpositive-Integer]
- (numbers ≤ 0).
-
- @|Typedracket| also includes a singleton type for each primitive value of
- these types: we already mentioned @racket[Zero], which is an alias of the
- @racket[0] type. Every number, character, string and boolean value can be used
- as a type, which is only inhabited by the same number, character, string or
- boolean value. For example, @racket[243] belongs to the singleton type
- @racket[243], which is a subtype of @racket[Positive-Integer].
-
- @examples[#:label #f #:eval (tr-eval)
- 0
- (ann 243 243)
- #t]}
-
- @asection{
- @atitle{Pairs and lists}
-
- Pairs are the central data structure of most Lisp dialects. They are used to
- build linked lists of pairs, terminated by @racket['()], the null element. The
- null element has the type @racket[Null], while the pairs which build the list
- have the type @racket[(Pairof _A _B)], where @racketid[_A] and @racketid[_B]
- are replaced by the actual types for the first and second elements of the
- pair. For example, the pair built using @racket[(cons 729 #true)], which
- contains @racket[729] as its first element, and @racket[#true] as its second
- element, has the type @racket[(Pairof Number Boolean)], or using the most
- precise singleton types, @racket[(Pairof 729 #true)].
-
- @examples[#:label #f #:eval (tr-eval)
- (cons 729 #true)
- '(729 . #true)]
-
- Heterogeneous linked lists of fixed length can be given a precise type by
- nesting the same number of pairs at the type level. For example, the list
- built with @racket[(list 81 #true 'hello)] has the type
- @racket[(List Number Boolean Symbol)], which is a shorthand for the type
- @racket[(Pairof Number (Pairof Boolean (Pairof Symbol Null)))]. Lists in
- @|typedracket| can thus be seen as the equivalent of a chain of nested
- 2-tuples in languages like @|CAML| or @|haskell|. The analog in
- object-oriented languages with support for generics would be a class
- @tt["Pair<A, B>"], where the generic type argument @racketid[B] could be
- instantiated by another instance of @tt["Pair"], and so on.
-
- @examples[#:label #f #:eval (tr-eval)
- (cons 81 (cons #true (cons 'hello null)))
- (ann (list 81 #true 'hello)
- (Pairof Number (Pairof Boolean (Pairof Symbol Null))))]
-
- The type of variable-length homogeneous linked lists can be described using
- the @racket[Listof] type operator. The type @racket[(Listof Integer)] is
- equivalent to @racket[(Rec R (U (Pairof Integer R) Null))]. The @racket[Rec]
- type operator describes @seclink["tr-presentation-recursive-types"]{recursive
- types}, and @racket[U] describes @seclink["tr-presentation-unions"]{unions}.
- Both of these features are described below, for now we will simply say that
- the previously given type is a recursive type @racket[R], which can be a
- @racket[(Pairof Integer R)] or @racket[Null] (to terminate the linked list).
-
- @examples[#:label #f #:eval (tr-eval)
- (ann (range 0 5) (Listof Number))]}
-
- @asection{
- @atitle{Symbols}
-
- Another of Racket's primitive datatypes is symbols. Symbols are interned
- strings: two occurrences of a symbol produce values which are pointer-equal if
- the symbols are equal (i.e. they represent the same string)@note{This is true
- with the exception of symbols created with @racket[gensym] and the like.
- @racket[gensym] produces a fresh symbol which is not interned, and therefore
- different from all existing symbols, and different from all symbols created
- in the future.}.
-
- @|Typedracket| includes the @racket[Symbol] type, to which all symbols
- belong. Additionally, there is a singleton type for each symbol: the type
- @racket['foo] is only inhabited by the symbol @racket['foo].
-
- @examples[#:label #f #:eval (tr-eval)
- 'foo]
-
- Singleton types containing symbols can be seen as similar to constructors
- without arguments in @|CAML| and @|haskell|, and as globally unique enum
- values in object-oriented languages. The main difference resides in the scope
- of the declaration: two constructor declarations with identical names in two
- separate files will usually give distinct types and values. Similarly, when
- using the ``type-safe enum'' design pattern, two otherwise identical
- declarations of an enum will yield objects of different types. In contrast,
- two uses of an interned symbols in Racket and @|typedracket| will produce
- identical values and types. A way of seeing this is that symbols are similar
- to constructors (in the functional programming sense) or enums which are
- implicitly declared globally.
-
- @examples[#:label #f #:eval (tr-eval)
- (module m1 typed/racket
- (define sym1 'foo)
- (provide sym1))
- (module m2 typed/racket
- (define sym2 'foo)
- (provide sym2))
- (require 'm1 'm2)
- (code:comment "The tow independent uses of 'foo are identical:")
- (eq? sym1 sym2)]
- }
-
- @asection{
- @atitle[#:tag "tr-presentation-unions"]{Unions}
-
- These singleton types may not seem very useful on their own. They can however
- be combined together with union types, which are built using the @racket[U]
- type operator.
-
- The union type @racket[(U 0 1 2)] is inhabited by the values @racket[0],
- @racket[1] and @racket[2], and by no other value. The @racket[Boolean] type is
- actually defined as @racket[(U #true #false)], i.e. the union of the singleton
- types containing the @racket[#true] and @racket[#false] values, respectively.
- The @racket[Nothing] type, which is not inhabited by any value, is defined as
- the empty union @racket[(U)]. The type @racket[Any] is the top type, i.e. it
- is a super-type of all other types, and can be seen as a large union including
- all other types, including those which will be declared later or in other
- units of code.
-
- Unions of symbols are similar to variants which contain zero-argument
- constructors, in @|CAML| or @|haskell|.
-
- @examples[#:label #f #:eval (tr-eval)
- (define v : (U 'foo 'bar) 'foo)
- v
- (set! v 'bar)
- v
- (code:comment "This throws an error at compile-time:")
- (eval:error (set! v 'oops))]
-
- A union such as @racket[(U 'ca (List 'cb Number) (List 'cc String Symbol))]
- can be seen as roughly the equivalent of a variant with three constructors,
- @racketid[ca], @racket[cb] and @racketid[cc], where the first has no
- arguments, the second has one argument (a @racket[Number]), and the third has
- two arguments (a @racket[String] and a @racket[Symbol]).
-
- The main difference is that a symbol can be used as parts of several unions,
- e.g. @racket[(U 'a 'b)] and @racket[(U 'b 'c)], while constructors can often
- only be part of the variant used to declare them. Unions of symbols are in
- this sense closer to @|CAML|'s so-called polymorphic
- variants@~cite["minskyRealWorldOCaml"] than to regular variants.
-
- @examples[#:label #f #:eval (tr-eval)
- (define-type my-variant (U 'ca
- (List 'cb Number)
- (List 'cc String Symbol)))
- (define v₁ : my-variant 'ca)
- (define v₂ : my-variant (list 'cb 2187))
- (define v3 : my-variant (list 'cc "Hello" 'world))]
-
- Finally, it is possible to mix different sorts of types within the same
- union: the type @racket[(U 0 #true 'other)] is inhabited by the number
- @racket[0], the boolean @racket[#true], and the symbol @racket['other].
- Translating such an union to a language like @|CAML| could be done by
- explicitly tagging each case of the union with a distinct constructor.
-
- Implementation-wise, all values in the so-called ``untyped'' version of
- Racket are tagged: a few bits within the value's representation are reserved
- and used to encode the value's type. When considering the target of a pointer
- in memory, Racket is therefore able to determine if the pointed-to value is a
- number, boolean, string, symbol and so on. Typed Racket preserves these
- run-time tags. They can then be used to detect the concrete type of a value
- when its static type is a union. This detection is done simply by using
- Racket's predicates: @racket[number?], @racket[string?], @racket[symbol?]
- etc.}
-
- @asection{
- @atitle{Intersections}
-
- Intersections are the converse of unions: instead of allowing a mixture of
- values of different types, an intersection type, described using the
- @racket[∩] type operator, only allows values which belong to all types.
-
- The intersection type @racket[(∩ Nonnegative-Integer Nonpositive-Integer)] is
- the singleton type @racket[0]. The intersection of @racket[(U 'a 'b 'c)] and
- @racket[(U 'b 'c 'd)] will be @racket[(U 'b 'c)], as @racket['b] and
- @racket['c] belong to both unions.
-
- @examples[
- #:label #f #:eval (tr-eval)
- (code:comment ":type shows the given type, or a simplified version of it")
- (:type (∩ (U 'a 'b 'c) (U 'b 'c 'd)))]
-
- @|Typedracket| is able to reduce some intersections such as those given above
- at compile-time. However, in some cases, it is forced to keep the intersection
- type as-is. For example, structs (@seclink["tr-presentation-structs"]{
- describled below} can, using special properties, impersonate functions. This
- mechanism is similar to PHP's @tt["__invoke"], the ability to overload
- @tt["operator()"] in @|CPP|. @|Typedracket| does not handle these properties
- (yet), and therefore cannot determine whether a given struct type also
- impersonates a function or not. This means that the intersection
- @racket[(∩ s (→ Number String))], where @racket[s] is a struct type, cannot be
- reduced to @racket[Nothing], because @|typedracket| cannot determine whether
- the struct @racket[s] can act as a function or not.
-
- Another situation where @|typedracket| cannot reduce the intersection is when
- intersecting two function types (@seclink["tr-presentation-functions"]{
- presented below}).
-
- @racketblock[
- (∩ (→ Number String) (→ Number Symbol))
- (∩ (→ Number String) (→ Boolean String))]
-
- The first intersection seems like could be simplified to
- @racket[(→ Number String) (→ Number Symbol)], and the second one could be
- simplified to @racket[(→ (U Number Boolean) String)], however the equivalence
- between these types has not been implemented (yet) in @|typedracket|, so we do
- not rely on them. Note that this issue is not a soundness issue: it only
- prevents passing values types to which they belong in principle, but it
- cannot be exploited to assign a value to a variable with an incompatible type.
-
- Finally, when some types are intersected with a polymorphic type variable,
- the intersection cannot be computed until the polymorphic type is
- instantiated.
-
- When @|typedracket| is able to perform a simplification, occurrences of
- @racket[Nothing] (the bottom type) propagate outwards in some cases, pairs and
- struct types which contain @racket[Nothing] as one of their elements being
- collapsed to @racket[Nothing]. This propagation of @racket[Nothing] starts
- from occurrences of @racket[Nothing] in the parts of the resulting type which
- are traversed by the intersection operator. It collapses the containing pairs
- and struct types to @racket[Nothing], moving outwards until the @racket[∩]
- operator itself is reached. In principle, the propagation could go on past
- that point, but this is not implemented yet in @|typedracket|@note{See
- @hyperlink["https://github.com/racket/typed-racket/issues/552"]{Issue #552}
- on @|typedracket|'s GitHub repository for more details on what prevents
- implementing a more aggressive propagation of @racket[Nothing].}.
-
- The type @racket[(∩ 'a 'b)] therefore gets simplified to @racket[Nothing],
- and the type @racket[(∩ (Pairof 'a 'x) (Pairof 'b 'x))] also simplifies to
- @racket[Nothing] (@|typedracket| initially pushes the intersection down the
- pairs, so that the type first becomes @racket[(Pairof (∩ 'a 'b) (∩ 'x 'x))],
- which is simplified to @racket[(Pairof Nothing 'x)], and the occurrence of
- @racket[Nothing] propagates outwards). However, if the user directly specifies
- the type @racket[(Pairof (∩ 'a 'b) Integer)], it is simplified to
- @racket[(Pairof Nothing Integer)], but the @racket[Nothing] does not propagate
- outwards beyond the initial use of @racket[∩].
-
- @examples[#:label #f #:eval (tr-eval)
- (:type (∩ 'a 'b))
- (:type (∩ (Pairof 'a 'x) (Pairof 'b 'x)))
- (:type (Pairof (∩ 'a 'b) Integer))]
-
- A simple workaround exists: the outer type, which could be collapsed to
- @racket[Nothing], can be intersected again with a type of the same shape. The
- outer intersection will traverse both types (the desired one and the
- ``shape''), and propagate the leftover @racket[Nothing] further out.
-
- @examples[#:label #f #:eval (tr-eval)
- (:type (Pairof (∩ 'a 'b) Integer))
- (:type (∩ (Pairof (∩ 'a 'b) Integer)
- (Pairof Any Any)))]
-
- These intersections are not very interesting on their own, as in most cases
- it is possible to express the resulting simplified type without using the
- intersection operator. They become more useful when mixed with polymorphic
- types: intersecting a polymorphic type variable with another type can be used
- to restrict the actual values that may be used. The type @racket[(∩ A T)],
- where @racket[A] is a polymorphic type variable and @racket[T] is a type
- defined elsewhere, is equivalent to the use of bounded type parameters in
- @|java| or @|csharp|. In @|csharp|, for example, the type @racket[(∩ A T)]
- would be written using an @tt["where A : T"] clause.}
-
- @asection{
- @atitle[#:tag "tr-presentation-structs"]{Structs}
-
- Racket also supports @racket[struct]s, which are mappings from fields to
- values. A struct is further distinguished by its struct type: instances of two
- struct types with the same name and fields, declared in separate files, can be
- differentiated using the predicates associated with these structs. Structs in
- Racket can be seen as the analog of classes containing only fields (but no
- methods) in @csharp or @|java|. Such classes are sometimes called ``Plain Old
- Data (POD) Objects''. Structs belong to a single-inheritance hierarchy:
- instances of the descendents of a struct type are recognised by their
- ancestor's predicate. When a struct inherits from another, it includes its
- parent's fields, and can add extra fields of its own.
-
- Each struct declaration within a @|typedracket| program additionally declares
- corresponding type.
-
- @examples[#:label #f #:eval (tr-eval)
- (struct parent ([field₁ : (Pairof String Symbol)])
- #:transparent)
- (struct s parent ([field₂ : Integer]
- [field₃ : Symbol])
- #:transparent)
- (s (cons "x" 'y) 123 'z)]
-
- In @|typedracket|, structs can have polymorphic type arguments, which can be
- used inside the types of the struct's fields.
-
- @examples[#:label #f #:eval (tr-eval)
- (struct (A B) poly-s ([field₁ : (Pairof A B)]
- [field₂ : Integer]
- [field₃ : B])
- #:transparent)
- (poly-s (cons "x" 'y) 123 'z)]
-
- Racket further supports
- @tech[#:doc '(lib "scribblings/reference/reference.scrbl")]{struct type
- properties}, which can be seen as a limited form of method definitions for a
- struct, thereby making them closer to real objects. The same struct type
- property can be implemented by many structs, and the declaration of a struct
- type property is therefore roughly equivalent to the declaration of an
- interface with a single method.
-
- Struct type properties are often considered a low-level mechanism in Racket.
- Among other things, a struct type property can only be used to define a single
- property at a time. When multiple ``methods'' have to be defined at once (for
- example, when defining the @racket[prop:equal+hash] property, which requires
- the definition of an equality comparison function, and two hashing functions),
- these can be grouped together in a list of functions, which is then used as
- the property's value.
- ``@seclink["struct-generics"
- #:doc '(lib "scribblings/reference/reference.scrbl")]{
- Generic interfaces}'' are a higher-level feature, which among other things
- allow the definition of multiple ``methods'' as part of a single generic
- interface, and offers a friendlier API for specifying the ``generic
- interface'' itself (i.e. what Object Oriented languages call an interfece), as
- and for specifying the implementation of said interface.
-
- @|Typedracket| unfortunately offers no support for struct type properties and
- generic interfaces for now. It is impossible to assert that a struct
- implements a given property at the type level, and it is also for example not
- possible to describe the type of a function accepting any struct implementing
- a given property or generic interface. Finally, no type checks are performed
- on the body of functions bound to such properties, and to check verifies that
- a function implementation with the right signature is supplied to a given
- property. Since struct type properties and generics cannot be used in a
- type-safe way for now, we refrain from using these features, and only use them
- to implement some very common properties@note{We built a thin macro wrapper
- which allows typechecking the implementation and signature of the functions
- bound to these two properties.}: @racket[prop:custom-write] which is the
- equivalent of @|java|'s @tt["void toString()"], and @racket[prop:equal+hash]
- which is equivalent to @|java|'s @tt["boolean equals(Object o)"] and
- @tt["int hashCode()"].
-
- }
-
- @asection{
- @atitle[#:tag "tr-presentation-functions"]{Functions}
-
- @|Typedracket| supports rich function types, to support some of the flexible
- use patterns allowed by Racket.
-
- The simple function type below indicates that the function expects two
- arguments (an integer and a string), and returns a boolean:
-
- @racketblock[(→ Integer String Boolean)]
-
- We note that unlike @|haskell| and @|CAML| functions, Racket functions are
- not implicitly curried. To express the corresponding curried function type,
- one would write:
-
- @racketblock[(→ Integer (→ String Boolean))]
-
- A function may additionally accept optional positional arguments, and keyword
- (i.e. named) arguments, both mandatory and optional:
-
- @racketblock[
- (code:comment "Mandatory string, optional integer and boolean arguments:")
- (->* (String) (Integer Boolean) Boolean)
- (code:comment "Mandatory keyword arguments:")
- (→ #:size Integer #:str String Boolean)
- (code:comment "Mandatory #:str, optional #:size and #:opt:")
- (->* (#:str String) (#:size Integer #:opt Boolean) Boolean)]
-
- Furthermore, functions in Racket accept a catch-all ``rest'' argument, which
- allows for the definition of variadic functions. Typed racket also allows
- expressing this at the type level, as long as the arguments covered by the
- ``rest'' clause all have the same type:
-
- @racketblock[
- (code:comment "The function accepts one integer and any number of strings:")
- (-> Integer String * Boolean)
- (code:comment "Same thing with an optional symbol inbetween: ")
- (->* (Integer) (Symbol) #:rest String Boolean)]
-
- One of @|typedracket|'s main goals is to be able to typecheck idiomatic
- Racket programs. Such programs may include functions whose return type depends
- on the values of the input arguments. Similarly, @racket[case-lambda] can be
- used to create lambda functions which dispatch to multiple behaviours based on
- the number of arguments passed to the function.
-
- @|Typedracket| provides the @racket[case→] type operator, which can be used to
- describe the type of these functions:
-
- @racketblock[
- (code:comment "Allows 1 or 3 arguments, with the same return type.")
- (case→ (→ Integer Boolean)
- (→ Integer String Symbol Boolean))
- (code:comment "A similar type based on optional arguments allows 1, 2 or 3")
- (code:comment " arguments in contrast:")
- (->* (Integer) (String Symbol) Boolean)
- (code:comment "The output type can depend on the input type:")
- (case→ (→ Integer Boolean)
- (→ String Symbol))
- (code:comment "Both features (arity and dependent output type) can be mixed")
- (case→ (→ Integer Boolean)
- (→ Integer String (Listof Boolean)))]
-
- Another important feature, which can be found in the type system of most
- functional programming languages, and most object-oriented languages, is
- parametric polymorphism. @|Typedracket| allows the definition of polymorphic
- structs, as detailed above, as well as polymorphic functions. For example, the
- function @racket[cons] can be considered as a polymorphic function with two
- polymorphic type arguments @racket[A] and @racket[B], which takes an argument
- of type @racket[A], an argument of type @racket[B], and returns a pair of
- @racket[A] and @racket[B].
-
- @racketblock[(∀ (A B) (→ A B (Pairof A B)))]
-
- @htodo{Something on which types can be inferred and which can't (for now).}
-
- Finally, predicates (functions whose results can be interpreted as booleans)
- can be used to gain information about the type of their argument, depending on
- the result. The type of a predicate can include positive and negative filters,
- indicated with @racket[#:+] and @racket[#:-], respectively. The type of the
- @racket[string?] predicate is:
-
- @racketblock[(→ Any Boolean : #:+ String #:- (! String))]
-
- In this notation, the positive filter @racket[#:+ String] indicates that when
- the predicate returns @racket[#true], the argument is known to be a
- @racket[String]. Conversely, when the predicate exits with @racket[#false],
- the negative filter @racket[#:- (! String)] indicates that the input could not
- (@racket[!]) possibly have been a string. The information gained this way
- allows regular conditionals based on arbitrary predicates to work like
- pattern-matching:
-
- @examples[#:label #f #:eval (tr-eval)
- (define (f [x : (U String Number Symbol)])
- (if (string? x)
- (code:comment "x is known to be a String here:")
- (ann x String)
- (code:comment "x is known to be a Number or a Symbol here:")
- (ann x (U Number Symbol))))]
-
- The propositions do not necessarily need to refer to the value as a whole,
- and can instead give information about a sub-part of the value. Right now, the
- user interface for specifying paths can only target the left and right members
- of @racket[cons] pairs, recursively. Internally, @|typedracket| supports
- richer paths, and the type inference can produce filters which give
- information about individual structure fields, or about the result of forced
- promises, for example.}
-
- @asection{
- @atitle[#:tag "tr-presentation-recursive-types"]{Recursive types}
-
- @|Typedracket| allows recursive types, both via (possibly mutually-recursive)
- named declarations, and via the @racket[Rec] type operator.
-
- In the following examples, the types @racket[Foo] and @racket[Bar] are
- mutually recursive. The type @racket[Foo] matches lists with an even number of
- alternating @racket[Integer] and @racket[String] elements, starting with an
- @racket[Integer],
-
- @racketblock[
- (define-type Foo (Pairof Integer Bar))
- (define-type Bar (Pairof String (U Foo Null)))]
-
- This same type could alternatively be defined using the @racket[Rec]
- operator. The notation @racket[(Rec R T)] builds the type @racket[T], where
- occurrences of @racket[R] are interpreted as recursive occurrences of
- @racket[T] itself.
-
- @racketblock[
- (Rec R
- (Pairof Integer
- (Pairof String
- (U R Null))))]}
-
- @asection{
- @atitle{Classes}
-
- The @racketmodname[racket/class] module provides an object-oriented system for
- Racket.
- }
-
- @asection{
- @atitle{Occurrence typing}
- }
-
- @asection{
- @atitle{Global type inference}
- }
-}
-\ No newline at end of file
+ http://racket-lang.org/
+|#
+ 25 7 #"wxtext\0"
+3 1 6 #"wxtab\0"
+1 1 8 #"wximage\0"
+2 0 8 #"wxmedia\0"
+4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0"
+1 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0"
+1 0 68
+(
+ #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr"
+ #"lib\"))\0"
+) 1 0 16 #"drscheme:number\0"
+3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0"
+1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0"
+1 0 93
+(
+ #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni"
+ #"pclass-wxme.ss\" \"framework\"))\0"
+) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0"
+0 0 19 #"drscheme:sexp-snip\0"
+0 0 29 #"drscheme:bindings-snipclass%\0"
+1 0 101
+(
+ #"((lib \"ellipsis-snip.rkt\" \"drracket\" \"private\") (lib \"ellipsi"
+ #"s-snip-wxme.rkt\" \"drracket\" \"private\"))\0"
+) 2 0 88
+(
+ #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r"
+ #"kt\" \"drracket\" \"private\"))\0"
+) 0 0 55
+#"((lib \"snip.rkt\" \"pict\") (lib \"snip-wxme.rkt\" \"pict\"))\0"
+1 0 34 #"(lib \"bullet-snip.rkt\" \"browser\")\0"
+0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0"
+1 0 22 #"drscheme:lambda-snip%\0"
+1 0 29 #"drclickable-string-snipclass\0"
+0 0 26 #"drracket:spacer-snipclass\0"
+0 0 57
+#"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0"
+1 0 18 #"java-comment-box%\0"
+1 0 23 #"java-interactions-box%\0"
+1 0 1 6 #"wxloc\0"
+ 0 0 70 0 1 #"\0"
+0 75 1 #"\0"
+0 12 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9
+#"Standard\0"
+0 75 10 #"Monospace\0"
+0 13 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24
+#"framework:default-color\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15
+#"text:ports out\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1
+-1 2 15 #"text:ports err\0"
+0 -1 1 #"\0"
+1 0 -1 -1 93 -1 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17
+#"text:ports value\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1
+-1 2 27 #"Matching Parenthesis Style\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1
+-1 2 1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37
+#"framework:syntax-color:scheme:symbol\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 38
+#"framework:syntax-color:scheme:keyword\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2
+38 #"framework:syntax-color:scheme:comment\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37
+#"framework:syntax-color:scheme:string\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 35
+#"framework:syntax-color:scheme:text\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 39
+#"framework:syntax-color:scheme:constant\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 49
+#"framework:syntax-color:scheme:hash-colon-keyword\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 42
+#"framework:syntax-color:scheme:parenthesis\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36
+#"framework:syntax-color:scheme:error\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36
+#"framework:syntax-color:scheme:other\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 16
+#"Misspelled Text\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2
+38 #"drracket:check-syntax:lexically-bound\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28
+#"drracket:check-syntax:set!d\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 37
+#"drracket:check-syntax:unused-require\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36
+#"drracket:check-syntax:free-variable\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31
+#"drracket:check-syntax:imported\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 47
+#"drracket:check-syntax:my-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50
+#"drracket:check-syntax:their-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 48
+#"drracket:check-syntax:unk-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2
+49 #"drracket:check-syntax:both-obligation-style-pref\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2
+41 #"profj:syntax-colors:scheme:block-comment\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 35
+#"profj:syntax-colors:scheme:keyword\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 139 0 139 0 0 0 -1 -1 2 37
+#"profj:syntax-colors:scheme:prim-type\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 139 0 139 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 38
+#"profj:syntax-colors:scheme:identifier\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 139 34 0 0 0 -1 -1 2 34
+#"profj:syntax-colors:scheme:string\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 139 34 0 0 0 -1 -1 2 35
+#"profj:syntax-colors:scheme:literal\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 139 34 0 0 0 -1 -1 2 35
+#"profj:syntax-colors:scheme:comment\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 33
+#"profj:syntax-colors:scheme:error\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 35
+#"profj:syntax-colors:scheme:default\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 37
+#"profj:syntax-colors:scheme:uncovered\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 35
+#"profj:syntax-colors:scheme:covered\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 139 0 139 0 0 0 -1 -1 2 37
+#"plt:module-language:test-coverage-on\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1
+#"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 38
+#"plt:module-language:test-coverage-off\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 4 1
+#"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0
+-1 -1 4 1 #"\0"
+0 -1 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1
+-1 4 1 #"\0"
+0 71 1 #"\0"
+1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 100 0 0 0 0 -1
+-1 2 1 #"\0"
+0 -1 1 #"\0"
+1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 0 0 0 0 0 -1 -1 4 1
+#"\0"
+0 -1 1 #"\0"
+1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 255 255 0 -1 -1
+ 0 6971 0 28 3 21 #"#lang scribble/manual"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"@"
+0 0 15 3 7 #"require"
+0 0 24 3 1 #"["
+0 0 19 3 10 #"\"util.rkt\""
+0 0 24 29 1 #"\n"
+0 0 24 3 10 #" ("
+0 0 14 3 9 #"for-label"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"only-meta-in"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"0"
+0 0 24 3 1 #" "
+0 0 14 3 12 #"typed/racket"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" "
+0 0 14 3 16 #"scribble/example"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" "
+0 0 14 3 13 #"racket/string"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #"@("
+0 0 14 3 11 #"use-mathjax"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #"@("
+0 0 15 3 6 #"define"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 2 #" ("
+0 0 14 3 17 #"make-eval-factory"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 12 #"typed/racket"
+0 0 24 3 3 #")))"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"@"
+0 0 14 3 5 #"title"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:style"
+0 0 24 3 2 #" ("
+0 0 14 3 10 #"with-html5"
+0 0 24 3 1 #" "
+0 0 14 3 16 #"manual-doc-style"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" "
+0 0 23 3 9 #"#:version"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"version-text"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" "
+0 0 23 3 5 #"#:tag"
+0 0 24 3 1 #" "
+0 0 19 3 9 #"\"tr-chap\""
+0 0 24 3 4 #"]{@|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 2 #"|}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 20 3 2 #"We"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"start"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"this"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"section"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"history:"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"Lisp"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 4 #"emph"
+0 0 24 3 1 #"{"
+0 0 20 3 3 #"the"
+0 0 24 3 1 #"}"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"language"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 5 #" lots"
+0 0 24 29 1 #"\n"
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"parentheses"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 7 #"shortly"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"following "
+0 0 29 3 7 #"Fortran"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"one"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"first"
+0 0 20 3 11 #" high-level"
+0 0 24 29 1 #"\n"
+0 0 20 3 11 #"programming"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"languages"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"was"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"initially"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"designed"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"between"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"1956"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"1958"
+0 0 20 3 1 #","
+0 0 20 3 4 #" and"
+0 0 24 29 1 #"\n"
+0 0 20 3 12 #"subsequently"
+0 0 20 3 12 #" implemented"
+0 0 24 3 1 #"@"
+0 0 14 3 5 #"~cite"
+0 0 24 3 1 #"["
+0 0 19 3 21 #"\"McCarthyHistoryLisp\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 20 3 1 #" "
+0 0 20 3 8 #"Dialects"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 5 #" Lisp"
+0 0 24 29 1 #"\n"
+0 0 20 3 9 #"generally"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"support"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"variety"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"programming"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"paradigms"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 9 #"including"
+0 0 20 3 2 #" ("
+0 0 20 3 3 #"but"
+0 0 20 3 4 #" not"
+0 0 24 29 1 #"\n"
+0 0 20 3 7 #"limited"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 2 #") "
+0 0 20 3 10 #"functional"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"programming"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 15 #"object-oriented"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"programming"
+0 0 20 3 2 #" ("
+0 0 20 3 4 #"e.g."
+0 0 20 3 4 #" via"
+0 0 24 29 1 #"\n"
+0 0 29 3 4 #"CLOS"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Common"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"Lisp"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Object"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"System"
+0 0 20 3 1 #")"
+0 0 20 3 1 #"."
+0 0 20 3 1 #" "
+0 0 20 3 3 #"One"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"most "
+0 0 29 3 10 #"proeminent"
+0 0 20 3 8 #" aspects"
+0 0 24 29 1 #"\n"
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"Lisp"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"is "
+0 0 29 3 13 #"homoiconicity"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"fact"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"that"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"programs"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"data"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"structures"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"look"
+0 0 20 3 4 #" the"
+0 0 24 29 1 #"\n"
+0 0 20 3 5 #"same."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"This"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"enables"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"programs"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"easily"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"manipulate"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"other"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"programs"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"led"
+0 0 20 3 3 #" to"
+0 0 24 29 1 #"\n"
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"extensive"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"use"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"macros."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"Uses"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"macros"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"usually"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"look"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"like"
+0 0 20 3 9 #" function"
+0 0 24 29 1 #"\n"
+0 0 20 3 12 #"applications"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"but"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 7 #"instead"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"invoking"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"target"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"function"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"at"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"run-time"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 6 #" macro"
+0 0 24 29 1 #"\n"
+0 0 20 3 4 #"will"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"perform"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"computation"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"at"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"compile-time"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"expand"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"new"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"code,"
+0 0 24 29 1 #"\n"
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"injected"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"replacement"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"macro"
+0 0 20 3 1 #"'"
+0 0 20 3 1 #"s"
+0 0 20 3 5 #" use."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 20 3 3 #"The"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"two"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"main"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"dialects"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"Lisp"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Common"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"Lisp"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"Scheme."
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Scheme"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"follows"
+0 0 20 3 2 #" a"
+0 0 24 29 1 #"\n"
+0 0 20 3 10 #"minimalist"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"philosophy"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"where"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"small"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"core"
+0 0 20 3 3 #" is"
+0 0 24 29 1 #"\n"
+0 0 20 3 12 #"standardised"
+0 0 24 3 1 #"@"
+0 0 14 3 5 #"~cite"
+0 0 24 3 1 #"["
+0 0 19 3 5 #"\"r5rs"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 19 3 5 #"\"r6rs"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 19 3 5 #"\"r7rs"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"subsequently"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"extended"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"via"
+0 0 20 3 7 #" macros"
+0 0 24 29 1 #"\n"
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"additional"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"function"
+0 0 20 3 13 #" definitions."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 20 3 6 #"Racket"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 8 #"formerly"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"named "
+0 0 29 3 3 #"PLT"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Scheme"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 7 #"started"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Scheme"
+0 0 20 3 1 #" "
+0 0 20 3 15 #"implementation."
+0 0 20 3 7 #" Racket"
+0 0 24 29 1 #"\n"
+0 0 20 3 7 #"evolved"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Racket"
+0 0 20 3 10 #" Manifesto"
+0 0 24 3 1 #"@"
+0 0 14 3 5 #"~cite"
+0 0 24 3 1 #"["
+0 0 19 3 16 #"\"racketmanifesto"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"presents"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"it"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 2 #" a"
+0 0 24 29 1 #"\n"
+0 0 20 3 2 #"``"
+0 0 20 3 20 #"programming-language"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"programming"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"language"
+0 0 20 3 2 #"''"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"language"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"helps"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 4 #" the"
+0 0 24 29 1 #"\n"
+0 0 20 3 8 #"creation"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"small"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"linguistic"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"extensions"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"well"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"entirely"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"new"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"languages."
+0 0 20 3 4 #" The"
+0 0 24 29 1 #"\n"
+0 0 20 3 6 #"Racket"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"ecosystem"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"features"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"many"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"languages"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"covering"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"many"
+0 0 20 3 11 #" paradigms:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"itemlist"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 1 #"{"
+0 0 20 3 4 #"The "
+0 0 24 3 1 #"@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 11 #"racket/base"
+0 0 24 3 1 #"]"
+0 0 20 3 40 #" language is a full-featured programming"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 56 #"language which mostly encourages functional programming."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 2 #"{@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 12 #"racket/class"
+0 0 24 3 1 #"]"
+0 0 20 3 11 #" implements"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 8 #"\"classes"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 23 3 5 #"#:doc"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 30 #"\"scribblings/guide/guide.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 3 #")]{"
+0 0 20 3 2 #"an"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 22 #"object-oriented system"
+0 0 24 3 1 #"}"
+0 0 20 3 19 #", implemented atop "
+0 0 24 3 1 #"@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 11 #"racket/base"
+0 0 24 3 1 #"]"
+0 0 20 3 6 #" using"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 51 #"macros, and can be used along with the rest of the "
+0 0 24 3 1 #"@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 11 #"racket/base"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"language."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 2 #"{@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"racklog"
+0 0 24 3 1 #"]"
+0 0 20 3 48 #" is a logic programming language in the style of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 6 #"prolog"
+0 0 20 3 57 #". The Racket ecosystem also includes an implementation of"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"datalog"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 2 #"{@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 4 #"\"top"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 23 3 5 #"#:doc"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 36 #"\"scribblings/scribble/scribble.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 3 #")]{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 8 #"Scribble"
+0 0 24 3 1 #"}"
+0 0 20 3 34 #" can be seen as an alternative to "
+0 0 24 3 2 #"@|"
+0 0 14 3 5 #"LaTeX"
+0 0 24 3 1 #"|"
+0 0 20 3 23 #", and is used to create"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"the "
+0 0 24 3 1 #"@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 4 #"\"top"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 23 3 5 #"#:doc"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 29 #"\"scribblings/main/start.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 3 #")]{"
+0 0 20 3 6 #"Racket"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 13 #"documentation"
+0 0 24 3 1 #"}"
+0 0 20 3 63
+#". It also supports literate programming, by embedding chunks of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 71
+(
+ #"code in the document which are then aggregated together. This thesis"
+ #" is"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 31 #"in fact written using Scribble."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 2 #"{@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 9 #"slideshow"
+0 0 24 3 1 #"]"
+0 0 20 3 6 #" is a "
+0 0 24 3 1 #"@"
+0 0 15 3 7 #"deftech"
+0 0 24 3 1 #"{"
+0 0 29 3 3 #"DSL"
+0 0 24 3 1 #"}"
+0 0 20 3 27 #" (domain-specific language)"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 74
+(
+ #"for the creation of presentations, and can be thought as an alternat"
+ #"ive to"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 6 #"Beamer"
+0 0 20 3 5 #" and "
+0 0 29 3 6 #"SliTeX"
+0 0 20 3 1 #"."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 2 #"{@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"r5rs"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"r6rs"
+0 0 24 3 1 #"]"
+0 0 20 3 23 #" are implementations of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 35 #"the corresponding scheme standards."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 2 #"{@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 4 #"\"top"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 23 3 5 #"#:doc"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 18 #"\"redex/redex.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 3 #")]{"
+0 0 29 3 5 #"Redex"
+0 0 24 3 1 #"}"
+0 0 20 3 5 #" is a"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 7 #"usetech"
+0 0 24 3 1 #"{"
+0 0 29 3 3 #"DSL"
+0 0 24 3 1 #"}"
+0 0 20 3 44 #" which allows the specification of reduction"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 74
+(
+ #"semantics for programming languages. It features tools to explore an"
+ #"d test"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 22 #"the defined semantics."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 3 #"{@|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 2 #"|@"
+0 0 14 3 5 #"~cite"
+0 0 24 3 1 #"["
+0 0 19 3 28 #"\"tobin-hochstadt_design_2008"
+0 0 19 3 1 #"\""
+0 0 24 29 1 #"\n"
+0 0 24 3 28 #" "
+0 0 19 3 27 #"\"tobin-hochstadt_typed_2010"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 22 #" is a typed variant of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"the main "
+0 0 24 3 1 #"@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"]"
+0 0 20 3 45 #" language. It is implemented as a macro which"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 76
+(
+ #"takes over the whole body of the program. That macro fully expands a"
+ #"ll other"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 32 #"macros in the program, and then "
+0 0 29 3 10 #"typechecks"
+0 0 20 3 22 #" the expanded program."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 4 #"item"
+0 0 24 3 2 #"{@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 4 #"\"top"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 23 3 5 #"#:doc"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 38 #"\"turnstile/scribblings/turnstile.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 3 #")]{"
+0 0 24 29 1 #"\n"
+0 0 24 3 5 #" @|"
+0 0 14 3 9 #"Turnstile"
+0 0 24 3 2 #"|}"
+0 0 20 3 55 #" allows the creation of new typed languages. It takes a"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 36 #"different approach when compared to "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 22 #", and threads the type"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 73
+(
+ #"information through assignments and special forms, in order to be ab"
+ #"le to"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 9 #"typecheck"
+0 0 20 3 62
+#" the program during expansion, instead of doing so afterwards."
+0 0 24 3 2 #"}]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 20 3 2 #"In"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"remainder"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"this"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"section"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"we"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"will"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"present"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"features"
+0 0 20 3 3 #" of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #"'"
+0 0 20 3 1 #"s"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"system"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"then"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"present"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"formal"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"semantics"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 7 #" subset"
+0 0 24 29 1 #"\n"
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"those"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 6 #"namely"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"part"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"relevant"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"our"
+0 0 20 3 6 #" work."
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"@"
+0 0 14 3 9 #"other-doc"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 40 #"\"typed-racket/scribblings/ts-guide.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #")]"
+0 0 20 3 4 #" and"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"@"
+0 0 14 3 9 #"other-doc"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 44 #"\"typed-racket/scribblings/ts-reference.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #")]"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"provide"
+0 0 20 3 5 #" good"
+0 0 24 29 1 #"\n"
+0 0 20 3 13 #"documentation"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"programmers"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"who"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"desire"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"use "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 9 #"; we will"
+0 0 24 29 1 #"\n"
+0 0 20 3 9 #"therefore"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"keep"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"our"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"overview"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"succinct"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"gloss"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"over"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"most"
+0 0 20 3 9 #" details."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 38 #"Overview of Typed Racket's type system"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 22 #"Simple primitive types"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"Typedracket"
+0 0 20 3 57 #" has types matching Racket's baggage of primitive values:"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"Char"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"String"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"Void"
+0 0 24 3 2 #"]@"
+0 0 14 3 4 #"note"
+0 0 24 3 1 #"{"
+0 0 20 3 4 #"The "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"Void"
+0 0 24 3 1 #"]"
+0 0 20 3 35 #" type contains only a single value,"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 28 3 2 #"#,"
+0 0 24 3 1 #"("
+0 0 14 3 4 #"void"
+0 0 24 3 2 #")]"
+0 0 20 3 27 #", and is equivalent to the "
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"void"
+0 0 24 3 1 #"]"
+0 0 20 3 8 #" type in"
+0 0 24 29 1 #"\n"
+0 0 24 3 5 #" @|"
+0 0 14 3 10 #"C-language"
+0 0 24 3 1 #"|"
+0 0 20 3 26 #". It is the equivalent of "
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 15 3 4 #"unit"
+0 0 24 3 1 #"]"
+0 0 20 3 4 #" of "
+0 0 24 3 1 #"@"
+0 0 14 3 4 #"CAML"
+0 0 20 3 4 #" and"
+0 0 24 29 1 #"\n"
+0 0 24 3 5 #" @|"
+0 0 14 3 7 #"haskell"
+0 0 24 3 1 #"|"
+0 0 20 3 65
+#", and is often used as the return type of functions which perform"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 45 #"side-effects. It should not be confused with "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 12 #", the bottom"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 71
+(
+ #"type which is not inhabited by any value, and is similar to the type"
+ #" of"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 5 #" @|"
+0 0 14 3 7 #"haskell"
+0 0 24 3 1 #"|"
+0 0 20 3 3 #"'s "
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 14 3 9 #"undefined"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #". "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 24 #" can be used for example"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 76
+(
+ #"as the type of functions which never return \342\200\224 in that way"
+ #" it is similar to"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 5 #" @|"
+0 0 14 3 10 #"C-language"
+0 0 24 3 1 #"|"
+0 0 20 3 3 #"'s "
+0 0 24 3 1 #"@"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 1 #"\""
+0 0 19 3 13 #"__attribute__"
+0 0 19 3 3 #" (("
+0 0 19 3 14 #"__noreturn__))"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 3 1 #"}"
+0 0 20 3 11 #" and so on."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 3 #"ann"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 21 3 3 #"243"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 19 3 13 #"\"Hello world\""
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 21 3 1 #"#"
+0 0 21 3 2 #"\\c"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 43 #"\"The void function produces the void value\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 43 #"\"Void values on their own are not printed,\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 46 #"\"so we place it in a list to make it visible.\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 4 #"list"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"void"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"For"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"numbers"
+0 0 20 3 2 #", "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"offers"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"``"
+0 0 20 3 7 #"numeric"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"tower"
+0 0 20 3 2 #"''"
+0 0 20 3 3 #" of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 21 #"partially-overlapping"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"types: "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 16 #"Positive-Integer"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"subtype"
+0 0 20 3 3 #" of"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"itself"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"subtype"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #". "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"Zero"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"containing"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"only"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"number"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"0"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"both"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"subtype"
+0 0 20 3 3 #" of"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 19 #"Nonnegative-Integer"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #" ("
+0 0 20 3 7 #"numbers"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"\342\211\245"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"0"
+0 0 20 3 2 #") "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 19 #"Nonpositive-Integer"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 1 #"("
+0 0 20 3 7 #"numbers"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"\342\211\244"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"0"
+0 0 20 3 2 #")."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"also"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"includes"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"singleton"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"each"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"primitive"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"value"
+0 0 20 3 3 #" of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"these"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"types:"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"we"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"already"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"mentioned "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"Zero"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"an"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"alias"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 4 #" the"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"0"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"type."
+0 0 20 3 1 #" "
+0 0 20 3 5 #"Every"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"number"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 9 #"character"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 6 #"string"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"boolean"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"value"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 5 #" used"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"only"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"inhabited"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"by"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"same"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"number"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 9 #"character"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 6 #"string"
+0 0 20 3 3 #" or"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"boolean"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"value."
+0 0 20 3 1 #" "
+0 0 20 3 3 #"For"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"example"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 3 #"243"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"belongs"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"singleton"
+0 0 20 3 5 #" type"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 3 #"243"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"subtype"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 16 #"Positive-Integer"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 21 3 1 #"0"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 3 #"ann"
+0 0 24 3 1 #" "
+0 0 21 3 3 #"243"
+0 0 24 3 1 #" "
+0 0 21 3 3 #"243"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 21 3 2 #"#t"
+0 0 24 3 2 #"]}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 15 #"Pairs and lists"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 76
+(
+ #"Pairs are the central data structure of most Lisp dialects. They are"
+ #" used to"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 43 #"build linked lists of pairs, terminated by "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 24 3 3 #"()]"
+0 0 20 3 23 #", the null element. The"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 26 #"null element has the type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"Null"
+0 0 24 3 1 #"]"
+0 0 20 3 38 #", while the pairs which build the list"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"have the type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"_A"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"_B"
+0 0 24 3 2 #")]"
+0 0 20 3 8 #", where "
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 14 3 2 #"_A"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 14 3 2 #"_B"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 73
+(
+ #"are replaced by the actual types for the first and second elements o"
+ #"f the"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 40 #"pair. For example, the pair built using "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 21 3 3 #"729"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 2 #")]"
+0 0 20 3 7 #", which"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"contains "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 3 #"729"
+0 0 24 3 1 #"]"
+0 0 20 3 27 #" as its first element, and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #"]"
+0 0 20 3 14 #" as its second"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 22 #"element, has the type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #")]"
+0 0 20 3 19 #", or using the most"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 25 #"precise singleton types, "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 21 3 3 #"729"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 21 3 3 #"729"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 21 3 3 #"729"
+0 0 24 3 1 #" "
+0 0 28 3 1 #"."
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 13 #"Heterogeneous"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"linked"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"lists"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"fixed"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"length"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"given"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"precise"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"type by"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"nesting"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"same"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"number"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"pairs"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"at"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"level."
+0 0 20 3 1 #" "
+0 0 20 3 3 #"For"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"example"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 8 #"the list"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"built"
+0 0 20 3 6 #" with "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 4 #"list"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"81"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 5 #"hello"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"has"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"the type"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 4 #"List"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"shorthand"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"the type"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"Null"
+0 0 24 3 4 #")))]"
+0 0 20 3 1 #"."
+0 0 20 3 1 #" "
+0 0 20 3 8 #"Lists in"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"thus"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"seen"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"equivalent"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"chain"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"of nested"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"2-tuples"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"languages"
+0 0 20 3 6 #" like "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"CAML"
+0 0 24 3 1 #"|"
+0 0 20 3 4 #" or "
+0 0 24 3 2 #"@|"
+0 0 14 3 7 #"haskell"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #"."
+0 0 20 3 5 #" The "
+0 0 29 3 6 #"analog"
+0 0 20 3 3 #" in"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 15 #"object-oriented"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"languages"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"support"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"generics"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"would"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"a class"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 1 #"\""
+0 0 19 3 6 #"Pair<A"
+0 0 19 3 1 #","
+0 0 19 3 3 #" B>"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"where"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"generic"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 10 #" argument "
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"B"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"could be"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 12 #"instantiated"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"by"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"another"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"instance"
+0 0 20 3 4 #" of "
+0 0 24 3 1 #"@"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 5 #"\"Pair"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 7 #" so on."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"81"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 5 #"hello"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"null"
+0 0 24 3 3 #")))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 3 #"ann"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"list"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"81"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 5 #"hello"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 18 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"Null"
+0 0 24 3 5 #"))))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"The"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 15 #"variable-length"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"homogeneous"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"linked"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"lists"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"described"
+0 0 20 3 6 #" using"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"Listof"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"operator."
+0 0 20 3 1 #" "
+0 0 20 3 3 #"The"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Listof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 2 #")]"
+0 0 20 3 3 #" is"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 10 #"equivalent"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"to "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"Rec"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"R"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"R"
+0 0 24 3 2 #") "
+0 0 14 3 4 #"Null"
+0 0 24 3 3 #"))]"
+0 0 20 3 1 #"."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"The "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"Rec"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"operator"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"describes "
+0 0 24 3 1 #"@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 32 #"\"tr-presentation-recursive-types"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 20 3 9 #"recursive"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 5 #"types"
+0 0 24 3 1 #"}"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 4 #"and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"U"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"describes "
+0 0 24 3 1 #"@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 23 #"\"tr-presentation-unions"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 20 3 6 #"unions"
+0 0 24 3 1 #"}"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"Both"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"these"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"features"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"described"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"below"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"now"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"we"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"will"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"simply"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"say"
+0 0 20 3 5 #" that"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"previously"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"given"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"recursive"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"R"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 2 #" a"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"R"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"or "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"Null"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #" ("
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"terminate"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"linked"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"list"
+0 0 20 3 2 #")."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 3 #"ann"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #"range"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"0"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"5"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"Listof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 4 #"))]}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 7 #"Symbols"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 30 #"Another of Racket's primitive "
+0 0 29 3 9 #"datatypes"
+0 0 20 3 33 #" is symbols. Symbols are interned"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 78
+(
+ #"strings: two occurrences of a symbol produce values which are pointe"
+ #"r-equal if"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 59
+#"the symbols are equal (i.e. they represent the same string)"
+0 0 24 3 1 #"@"
+0 0 14 3 4 #"note"
+0 0 24 3 1 #"{"
+0 0 20 3 12 #"This is true"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 43 #"with the exception of symbols created with "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"gensym"
+0 0 24 3 1 #"]"
+0 0 20 3 14 #" and the like."
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"gensym"
+0 0 24 3 1 #"]"
+0 0 20 3 61
+#" produces a fresh symbol which is not interned, and therefore"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 75
+(
+ #"different from all existing symbols, and different from all symbols "
+ #"created"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 14 #"in the future."
+0 0 24 3 1 #"}"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 14 #" includes the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"Symbol"
+0 0 24 3 1 #"]"
+0 0 20 3 27 #" type, to which all symbols"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 73
+(
+ #"belong. Additionally, there is a singleton type for each symbol: the"
+ #" type"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"foo"
+0 0 24 3 1 #"]"
+0 0 20 3 33 #" is only inhabited by the symbol "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"foo"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"foo"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 73
+(
+ #"Singleton types containing symbols can be seen as similar to constru"
+ #"ctors"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 21 #"without arguments in "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"CAML"
+0 0 24 3 1 #"|"
+0 0 20 3 5 #" and "
+0 0 24 3 2 #"@|"
+0 0 14 3 7 #"haskell"
+0 0 24 3 1 #"|"
+0 0 20 3 25 #", and as globally unique "
+0 0 29 3 4 #"enum"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 77
+(
+ #"values in object-oriented languages. The main difference resides in "
+ #"the scope"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 76
+(
+ #"of the declaration: two constructor declarations with identical name"
+ #"s in two"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 75
+(
+ #"separate files will usually give distinct types and values. Similarl"
+ #"y, when"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 22 #"using the ``type-safe "
+0 0 29 3 4 #"enum"
+0 0 20 3 42 #"'' design pattern, two otherwise identical"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 19 #"declarations of an "
+0 0 29 3 4 #"enum"
+0 0 20 3 52 #" will yield objects of different types. In contrast,"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 46 #"two uses of an interned symbols in Racket and "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 13 #" will produce"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 65
+#"identical values and types. A way of seeing this is that symbols "
+0 0 20 3 4 #"are "
+0 0 20 3 7 #"similar"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 18 #" constructors (in "
+0 0 20 3 4 #"the "
+0 0 20 3 11 #"functional "
+0 0 20 3 12 #"programming "
+0 0 20 3 10 #"sense) or "
+0 0 29 3 5 #"enums"
+0 0 20 3 10 #" which are"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 29 #"implicitly declared globally."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"module"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"m1"
+0 0 24 3 1 #" "
+0 0 14 3 12 #"typed/racket"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"sym1"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"foo"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 14 3 7 #"provide"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"sym1"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"module"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"m2"
+0 0 24 3 1 #" "
+0 0 14 3 12 #"typed/racket"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"sym2"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"foo"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 14 3 7 #"provide"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"sym2"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 7 #"require"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"m1"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"m2"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 49 #"\"The tow independent uses of 'foo are identical:\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 3 #"eq?"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"sym1"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"sym2"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" }"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"["
+0 0 23 3 5 #"#:tag"
+0 0 24 3 1 #" "
+0 0 19 3 23 #"\"tr-presentation-unions"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 20 3 6 #"Unions"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 77
+(
+ #"These singleton types may not seem very useful on their own. They ca"
+ #"n however"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 65
+#"be combined together with union types, which are built using the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"U"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"type operator."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 15 #"The union type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"0"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"1"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"2"
+0 0 24 3 2 #")]"
+0 0 20 3 28 #" is inhabited by the values "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"0"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"1"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"2"
+0 0 24 3 1 #"]"
+0 0 20 3 29 #", and by no other value. The "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #"]"
+0 0 20 3 8 #" type is"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 20 #"actually defined as "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #" "
+0 0 21 3 6 #"#false"
+0 0 24 3 2 #")]"
+0 0 20 3 33 #", i.e. the union of the singleton"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 21 #"types containing the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 6 #"#false"
+0 0 24 3 1 #"]"
+0 0 20 3 22 #" values, respectively."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"The "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 57 #" type, which is not inhabited by any value, is defined as"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 16 #"the empty union "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 2 #")]"
+0 0 20 3 11 #". The type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"Any"
+0 0 24 3 1 #"]"
+0 0 20 3 25 #" is the top type, i.e. it"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 78
+(
+ #"is a super-type of all other types, and can be seen as a large union"
+ #" including"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 73
+(
+ #"all other types, including those which will be declared later or in "
+ #"other"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"units of code."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 69
+(
+ #"Unions of symbols are similar to variants which contain zero-argumen"
+ #"t"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 17 #"constructors, in "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"CAML"
+0 0 24 3 1 #"|"
+0 0 20 3 4 #" or "
+0 0 24 3 2 #"@|"
+0 0 14 3 7 #"haskell"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"v"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"foo"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"bar"
+0 0 24 3 2 #") "
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"foo"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 14 3 1 #"v"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 4 #"set!"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"v"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 3 #"bar"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 12 #" "
+0 0 14 3 1 #"v"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 5 #"\"This"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"throws"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"an"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"error"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"at"
+0 0 19 3 14 #" compile-time:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 10 #"eval:error"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"set!"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"v"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 4 #"oops"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 1 #"A"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"union"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"such"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"as "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"ca"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"List"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"cb"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 3 #") ("
+0 0 14 3 4 #"List"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"cc"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"seen"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"roughly"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"equivalent"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"variant"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"three"
+0 0 20 3 1 #" "
+0 0 20 3 13 #"constructors,"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 14 3 2 #"ca"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 2 #"cb"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"and "
+0 0 24 3 1 #"@"
+0 0 14 3 8 #"racketid"
+0 0 24 3 1 #"["
+0 0 14 3 2 #"cc"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"where"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"first"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"has"
+0 0 20 3 3 #" no"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"arguments"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"second"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"has"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"one"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"argument"
+0 0 20 3 2 #" ("
+0 0 20 3 2 #"a "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #")"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"third"
+0 0 20 3 4 #" has"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"two"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"arguments"
+0 0 20 3 2 #" ("
+0 0 20 3 2 #"a "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"String"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"a "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"Symbol"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #")."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"The"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"main"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"difference"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"that"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"symbol"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"used"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"parts"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"several"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"unions,"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"e.g. "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"c"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"while"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"constructors"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 6 #" often"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"only"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"part"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"variant"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"used"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"declare"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"them."
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Unions"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"symbols"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 3 #" in"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"this"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"sense"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"closer"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"to "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"CAML"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #"'"
+0 0 20 3 1 #"s"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"so-called"
+0 0 20 3 12 #" polymorphic"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"variants"
+0 0 24 3 1 #"@"
+0 0 14 3 5 #"~cite"
+0 0 24 3 1 #"["
+0 0 19 3 21 #"\"minskyRealWorldOCaml"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"than"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"regular"
+0 0 20 3 10 #" variants."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 11 #"define-type"
+0 0 24 3 1 #" "
+0 0 14 3 10 #"my-variant"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"ca"
+0 0 24 29 1 #"\n"
+0 0 24 3 40 #" ("
+0 0 14 3 4 #"List"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"cb"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 40 #" ("
+0 0 14 3 4 #"List"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"cc"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 3 #")))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"v\342\202\201"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 14 3 10 #"my-variant"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"ca"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"v\342\202\202"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 14 3 10 #"my-variant"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"list"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"cb"
+0 0 24 3 1 #" "
+0 0 21 3 4 #"2187"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 1 #" "
+0 0 14 3 2 #"v3"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 14 3 10 #"my-variant"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"list"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 2 #"cc"
+0 0 24 3 1 #" "
+0 0 19 3 6 #"\"Hello"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 5 #"world"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"Finally"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"it"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"possible"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"mix"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"different"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"sorts"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"types"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"within"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 5 #" same"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"union:"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"0"
+0 0 24 3 1 #" "
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 5 #"other"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"inhabited"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"by"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 7 #" number"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"0"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"boolean "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"symbol "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 14 3 5 #"other"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 11 #"Translating"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"such"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"an"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"union"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"language"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"like "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"CAML"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"could"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"done"
+0 0 20 3 3 #" by"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 10 #"explicitly"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"tagging"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"each"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"case"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"union"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"distinct"
+0 0 20 3 13 #" constructor."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 19 #"Implementation-wise"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"all"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"values"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"so-called"
+0 0 20 3 3 #" ``"
+0 0 29 3 7 #"untyped"
+0 0 20 3 2 #"''"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"version"
+0 0 20 3 3 #" of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"Racket"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"tagged:"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"few"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"bits"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"within"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"value"
+0 0 20 3 1 #"'"
+0 0 20 3 1 #"s"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"representation"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 9 #" reserved"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"used"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"encode"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"value"
+0 0 20 3 1 #"'"
+0 0 20 3 1 #"s"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"type."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"When"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"considering"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"target"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 8 #" pointer"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"memory"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Racket"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"therefore"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"able"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"determine"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"if"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"pointed-to"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"value"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 2 #" a"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"number"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 7 #"boolean"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 6 #"string"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 6 #"symbol"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"so"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"on."
+0 0 20 3 1 #" "
+0 0 20 3 5 #"Typed"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Racket"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"preserves"
+0 0 20 3 6 #" these"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"run-time"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"tags."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"They"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"then"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"used"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"detect"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"concrete"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 6 #" value"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"when"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"its"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"static"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"union."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"This"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"detection"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"done"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"simply"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"by"
+0 0 20 3 6 #" using"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"Racket"
+0 0 20 3 1 #"'"
+0 0 20 3 1 #"s"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"predicates: "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"number?"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"string?"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #", "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"symbol?"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"etc."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 13 #"Intersections"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 74
+(
+ #"Intersections are the converse of unions: instead of allowing a mixt"
+ #"ure of"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 68
+#"values of different types, an intersection type, described using the"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #"]"
+0 0 20 3 61
+#" type operator, only allows values which belong to all types."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 22 #"The intersection type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 14 3 19 #"Nonnegative-Integer"
+0 0 24 3 1 #" "
+0 0 14 3 19 #"Nonpositive-Integer"
+0 0 24 3 2 #")]"
+0 0 20 3 3 #" is"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 19 #"the singleton type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"0"
+0 0 24 3 1 #"]"
+0 0 20 3 22 #". The intersection of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"c"
+0 0 24 3 2 #")]"
+0 0 20 3 4 #" and"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"c"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"d"
+0 0 24 3 2 #")]"
+0 0 20 3 9 #" will be "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"c"
+0 0 24 3 2 #")]"
+0 0 20 3 5 #", as "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #"]"
+0 0 20 3 4 #" and"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"c"
+0 0 24 3 1 #"]"
+0 0 20 3 23 #" belong to both unions."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #" "
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 5 #":type"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"shows"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"the"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"given"
+0 0 19 3 1 #" "
+0 0 19 3 4 #"type"
+0 0 19 3 1 #","
+0 0 19 3 1 #" "
+0 0 19 3 2 #"or"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"a"
+0 0 19 3 1 #" "
+0 0 19 3 10 #"simplified"
+0 0 19 3 1 #" "
+0 0 19 3 7 #"version"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"of"
+0 0 19 3 3 #" it"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 5 #":type"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"c"
+0 0 24 3 3 #") ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"c"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"d"
+0 0 24 3 4 #")))]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"able"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"reduce"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 13 #"intersections"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"such"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 17 #"those given above"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"at"
+0 0 20 3 1 #" "
+0 0 20 3 13 #"compile-time."
+0 0 20 3 1 #" "
+0 0 20 3 7 #"However"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"cases"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"it"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"forced"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 21 #"keep the intersection"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"as-is."
+0 0 20 3 1 #" "
+0 0 20 3 13 #"For example, "
+0 0 29 3 7 #"structs"
+0 0 20 3 2 #" ("
+0 0 24 3 1 #"@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 24 #"\"tr-presentation-structs"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 29 3 10 #"describled"
+0 0 20 3 6 #" below"
+0 0 24 3 1 #"}"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"using"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"special"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"properties"
+0 0 20 3 1 #","
+0 0 20 3 28 #" impersonate functions. This"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 24 #"mechanism is similar to "
+0 0 29 3 5 #"PHP's"
+0 0 20 3 1 #" "
+0 0 24 3 1 #"@"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 9 #"\"__invoke"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 20 #" ability to overload"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 1 #"\""
+0 0 19 3 10 #"operator()"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 4 #" in "
+0 0 24 3 2 #"@|"
+0 0 14 3 3 #"CPP"
+0 0 24 3 1 #"|"
+0 0 20 3 2 #". "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"does"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"not"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"handle"
+0 0 20 3 17 #" these properties"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 1 #"("
+0 0 20 3 3 #"yet"
+0 0 20 3 1 #")"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"therefore"
+0 0 20 3 7 #" cannot"
+0 0 20 3 10 #" determine"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"whether"
+0 0 20 3 9 #" a given "
+0 0 29 3 6 #"struct"
+0 0 20 3 10 #" type also"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 12 #"impersonates"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"function"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"or"
+0 0 20 3 5 #" not."
+0 0 20 3 5 #" This"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"means"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"that"
+0 0 20 3 17 #" the intersection"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"s"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 3 #"))]"
+0 0 20 3 8 #", where "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"s"
+0 0 24 3 1 #"]"
+0 0 20 3 6 #" is a "
+0 0 29 3 6 #"struct"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"type,"
+0 0 20 3 10 #" cannot be"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 11 #"reduced to "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 10 #", because "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"cannot"
+0 0 20 3 18 #" determine whether"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"the "
+0 0 29 3 6 #"struct"
+0 0 20 3 1 #" "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"s"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"act"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 2 #" a"
+0 0 20 3 17 #" function or not."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"Another"
+0 0 20 3 17 #" situation where "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"cannot"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"reduce"
+0 0 20 3 1 #" "
+0 0 20 3 24 #"the intersection is when"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 16 #"intersecting two"
+0 0 20 3 17 #" function types ("
+0 0 24 3 1 #"@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 26 #"\"tr-presentation-functions"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 15 #"presented below"
+0 0 24 3 1 #"}"
+0 0 20 3 2 #")."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 3 #") ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 3 #") ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"The"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"first"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"intersection"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"seems"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"like"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"could"
+0 0 20 3 1 #" "
+0 0 20 3 16 #"be simplified to"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 3 #") ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"second"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"one could be"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"simplified to "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #") "
+0 0 14 3 6 #"String"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 23 #"however the equivalence"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"between"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"these"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"types"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"has"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"not"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"been"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"implemented"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"(yet) in "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 8 #"so we do"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"not"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"rely"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"on"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"them."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"Note"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"that"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"this"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"issue"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"not"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"soundness"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"issue: it only"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"prevents"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"passing"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"values"
+0 0 20 3 2 #" "
+0 0 20 3 5 #"types"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"they"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"belong"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 17 #"principle, but it"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"cannot"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"exploited"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"assign"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"value"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"variable"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 21 #"an incompatible type."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"Finally,"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"when"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"types"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"intersected"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 26 #"polymorphic type variable,"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"intersection"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"cannot"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"computed"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"until"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 19 #"polymorphic type is"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 13 #"instantiated."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"When "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"able"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"perform"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 30 #"simplification, occurrences of"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"("
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"bottom"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 2 #") "
+0 0 20 3 9 #"propagate"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"outwards"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 16 #"cases, pairs and"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 6 #"struct"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"types"
+0 0 20 3 15 #" which contain "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"one"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 20 #"their elements being"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 13 #"collapsed to "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"This"
+0 0 20 3 16 #" propagation of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 7 #" starts"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"from"
+0 0 20 3 16 #" occurrences of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"parts"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 20 #"resulting type which"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"traversed"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"by"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"intersection"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"operator."
+0 0 20 3 1 #" "
+0 0 20 3 2 #"It"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"collapses"
+0 0 20 3 1 #" "
+0 0 20 3 20 #"the containing pairs"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"and "
+0 0 29 3 6 #"struct"
+0 0 20 3 10 #" types to "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 6 #"moving"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"outwards"
+0 0 20 3 11 #" until the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"operator"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"itself"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"reached."
+0 0 20 3 1 #" "
+0 0 20 3 2 #"In"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"principle,"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"propagation"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"could"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"go on past"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"that"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"point,"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"but"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"this"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"not"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"implemented"
+0 0 20 3 8 #" yet in "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 2 #"|@"
+0 0 14 3 4 #"note"
+0 0 24 3 1 #"{"
+0 0 20 3 3 #"See"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @"
+0 0 14 3 9 #"hyperlink"
+0 0 24 3 1 #"["
+0 0 19 3 50 #"\"https://github.com/racket/typed-racket/issues/552"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 20 3 10 #"Issue #552"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 3 #"on "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 54 #"'s GitHub repository for more details on what prevents"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 46 #"implementing a more aggressive propagation of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 3 1 #"}"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"The type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"therefore"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"gets"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"simplified to "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"the type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"x"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"x"
+0 0 24 3 3 #"))]"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"also"
+0 0 20 3 14 #" simplifies to"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #" ("
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"initially"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"pushes"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"intersection"
+0 0 20 3 9 #" down the"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"pairs"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"so"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"that"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"first becomes "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 3 #") ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"x"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"x"
+0 0 24 3 3 #"))]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"simplified to "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"x"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 14 #" occurrence of"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"propagates"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"outwards"
+0 0 20 3 1 #")"
+0 0 20 3 1 #"."
+0 0 20 3 1 #" "
+0 0 20 3 8 #"However,"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"if"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"user"
+0 0 20 3 19 #" directly specifies"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"the type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 2 #") "
+0 0 14 3 7 #"Integer"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"it"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 14 #" simplified to"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 8 #"but the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"does"
+0 0 20 3 14 #" not propagate"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"outwards"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"beyond"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"initial"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"use of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 5 #":type"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 5 #":type"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"x"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"x"
+0 0 24 3 3 #")))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 5 #":type"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 2 #") "
+0 0 14 3 7 #"Integer"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"A "
+0 0 20 3 7 #"simple "
+0 0 20 3 11 #"workaround "
+0 0 20 3 8 #"exists: "
+0 0 20 3 4 #"the "
+0 0 20 3 6 #"outer "
+0 0 20 3 6 #"type, "
+0 0 20 3 27 #"which could be collapsed to"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 9 #", can be "
+0 0 20 3 12 #"intersected "
+0 0 20 3 6 #"again "
+0 0 20 3 7 #"with a "
+0 0 20 3 8 #"type of "
+0 0 20 3 4 #"the "
+0 0 20 3 15 #"same shape. The"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"outer "
+0 0 20 3 13 #"intersection "
+0 0 20 3 5 #"will "
+0 0 20 3 9 #"traverse "
+0 0 20 3 5 #"both "
+0 0 20 3 30 #"types (the desired one and the"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 16 #"``shape''), and "
+0 0 20 3 23 #"propagate the leftover "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Nothing"
+0 0 24 3 1 #"]"
+0 0 20 3 13 #" further out."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 5 #":type"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 2 #") "
+0 0 14 3 7 #"Integer"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 5 #":type"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"a"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"b"
+0 0 24 3 2 #") "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 23 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"Any"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"Any"
+0 0 24 3 4 #")))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"These "
+0 0 20 3 14 #"intersections "
+0 0 20 3 8 #"are not "
+0 0 20 3 5 #"very "
+0 0 20 3 42 #"interesting on their own, as in most cases"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"it"
+0 0 20 3 4 #" is "
+0 0 20 3 12 #"possible to "
+0 0 20 3 12 #"express the "
+0 0 20 3 10 #"resulting "
+0 0 20 3 11 #"simplified "
+0 0 20 3 5 #"type "
+0 0 20 3 17 #"without using the"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 13 #"intersection "
+0 0 20 3 15 #"operator. They "
+0 0 20 3 7 #"become "
+0 0 20 3 5 #"more "
+0 0 20 3 7 #"useful "
+0 0 20 3 5 #"when "
+0 0 20 3 22 #"mixed with polymorphic"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"types: "
+0 0 20 3 15 #"intersecting a "
+0 0 20 3 12 #"polymorphic "
+0 0 20 3 5 #"type "
+0 0 20 3 9 #"variable "
+0 0 20 3 29 #"with another type can be used"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"to "
+0 0 20 3 9 #"restrict "
+0 0 20 3 4 #"the "
+0 0 20 3 7 #"actual "
+0 0 20 3 34 #"values that may be used. The type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"T"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"where "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"A"
+0 0 24 3 1 #"]"
+0 0 20 3 6 #" is a "
+0 0 20 3 30 #"polymorphic type variable and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"T"
+0 0 24 3 1 #"]"
+0 0 20 3 10 #" is a type"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"defined "
+0 0 20 3 14 #"elsewhere, is "
+0 0 20 3 14 #"equivalent to "
+0 0 20 3 11 #"the use of "
+0 0 20 3 26 #"bounded type parameters in"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 4 #"java"
+0 0 24 3 1 #"|"
+0 0 20 3 4 #" or "
+0 0 24 3 2 #"@|"
+0 0 14 3 6 #"csharp"
+0 0 24 3 1 #"|"
+0 0 20 3 5 #". In "
+0 0 24 3 2 #"@|"
+0 0 14 3 6 #"csharp"
+0 0 24 3 1 #"|"
+0 0 20 3 2 #", "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"example"
+0 0 20 3 11 #", the type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\210\251"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"T"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"would be "
+0 0 20 3 17 #"written using an "
+0 0 24 3 1 #"@"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 1 #"\""
+0 0 19 3 5 #"where"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"A"
+0 0 19 3 1 #" "
+0 0 19 3 1 #":"
+0 0 19 3 2 #" T"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 8 #" clause."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"["
+0 0 23 3 5 #"#:tag"
+0 0 24 3 1 #" "
+0 0 19 3 24 #"\"tr-presentation-structs"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 29 3 7 #"Structs"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 21 #"Racket also supports "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 15 3 6 #"struct"
+0 0 24 3 1 #"]"
+0 0 20 3 36 #"s, which are mappings from fields to"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 10 #"values. A "
+0 0 29 3 6 #"struct"
+0 0 20 3 33 #" is further distinguished by its "
+0 0 29 3 6 #"struct"
+0 0 20 3 23 #" type: instances of two"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 6 #"struct"
+0 0 20 3 72
+(
+ #" types with the same name and fields, declared in separate files, ca"
+ #"n be"
+) 0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 58
+#"differentiated using the predicates associated with these "
+0 0 29 3 7 #"structs"
+0 0 20 3 2 #". "
+0 0 29 3 7 #"Structs"
+0 0 20 3 3 #" in"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 26 #"Racket can be seen as the "
+0 0 29 3 6 #"analog"
+0 0 20 3 42 #" of classes containing only fields (but no"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 12 #"methods) in "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"csharp"
+0 0 20 3 4 #" or "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"java"
+0 0 24 3 1 #"|"
+0 0 20 3 47 #". Such classes are sometimes called ``Plain Old"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 22 #"Data (POD) Objects''. "
+0 0 29 3 7 #"Structs"
+0 0 20 3 42 #" belong to a single-inheritance hierarchy:"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 17 #"instances of the "
+0 0 29 3 11 #"descendents"
+0 0 20 3 6 #" of a "
+0 0 29 3 6 #"struct"
+0 0 20 3 29 #" type are recognised by their"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 29 #"ancestor's predicate. When a "
+0 0 29 3 6 #"struct"
+0 0 20 3 39 #" inherits from another, it includes its"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 53 #"parent's fields, and can add extra fields of its own."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"Each "
+0 0 29 3 6 #"struct"
+0 0 20 3 22 #" declaration within a "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 30 #" program additionally declares"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 19 #"corresponding type."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"struct"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"parent"
+0 0 24 3 3 #" (["
+0 0 14 3 8 #"field\342\202\201"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 3 #")])"
+0 0 24 29 1 #"\n"
+0 0 24 3 14 #" "
+0 0 23 3 13 #"#:transparent"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"struct"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"s"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"parent"
+0 0 24 3 3 #" (["
+0 0 14 3 8 #"field\342\202\202"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 31 #" ["
+0 0 14 3 8 #"field\342\202\203"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 2 #"])"
+0 0 24 29 1 #"\n"
+0 0 24 3 14 #" "
+0 0 23 3 13 #"#:transparent"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 1 #"s"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 19 3 2 #"\"x"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"y"
+0 0 24 3 2 #") "
+0 0 21 3 3 #"123"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"z"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"In "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 2 #", "
+0 0 29 3 7 #"structs"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"have"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"polymorphic"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"arguments"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 7 #" can be"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"used"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"inside"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"types"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"of the "
+0 0 29 3 8 #"struct's"
+0 0 20 3 8 #" fields."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"struct"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"B"
+0 0 24 3 2 #") "
+0 0 14 3 6 #"poly-s"
+0 0 24 3 3 #" (["
+0 0 14 3 8 #"field\342\202\201"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"B"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 3 35 #" ["
+0 0 14 3 8 #"field\342\202\202"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 35 #" ["
+0 0 14 3 8 #"field\342\202\203"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"B"
+0 0 24 3 2 #"])"
+0 0 24 29 1 #"\n"
+0 0 24 3 14 #" "
+0 0 23 3 13 #"#:transparent"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 14 3 6 #"poly-s"
+0 0 24 3 2 #" ("
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #" "
+0 0 19 3 2 #"\"x"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"y"
+0 0 24 3 2 #") "
+0 0 21 3 3 #"123"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 14 3 1 #"z"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"Racket"
+0 0 20 3 17 #" further supports"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 4 #"tech"
+0 0 24 3 1 #"["
+0 0 23 3 5 #"#:doc"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 38 #"\"scribblings/reference/reference.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 3 #")]{"
+0 0 29 3 6 #"struct"
+0 0 20 3 5 #" type"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 10 #"properties"
+0 0 24 3 1 #"}"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"seen"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"limited"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"form"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"method"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"definitions"
+0 0 20 3 6 #" for a"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 6 #"struct"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 7 #"thereby"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"making"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"them"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"closer"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"real"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"objects."
+0 0 20 3 1 #" "
+0 0 20 3 9 #"The same "
+0 0 29 3 6 #"struct"
+0 0 20 3 5 #" type"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"implemented"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"by many "
+0 0 29 3 7 #"structs"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"declaration"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"of a "
+0 0 29 3 6 #"struct"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"therefore"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"roughly"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"equivalent"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 11 #"declaration"
+0 0 20 3 6 #" of an"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"interface"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 15 #" single method."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 6 #"Struct"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"properties"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"often"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"considered"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"low-level"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"mechanism"
+0 0 20 3 11 #" in Racket."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"Among"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"other"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"things"
+0 0 20 3 4 #", a "
+0 0 29 3 6 #"struct"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"only"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"used"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"define"
+0 0 20 3 9 #" a single"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"at"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"time."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"When"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"multiple"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"``"
+0 0 20 3 7 #"methods"
+0 0 20 3 2 #"''"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"have"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"defined"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"at"
+0 0 20 3 10 #" once (for"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"example"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 4 #"when"
+0 0 20 3 1 #" "
+0 0 20 3 13 #"defining the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 15 #"prop:equal+hash"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 1 #","
+0 0 20 3 15 #" which requires"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"definition"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"an"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"equality"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"comparison"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"function"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"two"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"hashing"
+0 0 20 3 12 #" functions),"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"these"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"can"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"grouped"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"together"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"list"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"functions"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"then"
+0 0 20 3 8 #" used as"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 9 #"'s value."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"``"
+0 0 24 3 1 #"@"
+0 0 14 3 7 #"seclink"
+0 0 24 3 1 #"["
+0 0 19 3 16 #"\"struct-generics"
+0 0 19 3 1 #"\""
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" "
+0 0 23 3 5 #"#:doc"
+0 0 24 3 1 #" "
+0 0 21 3 1 #"'"
+0 0 24 3 1 #"("
+0 0 14 3 3 #"lib"
+0 0 24 3 1 #" "
+0 0 19 3 38 #"\"scribblings/reference/reference.scrbl"
+0 0 19 3 1 #"\""
+0 0 24 3 3 #")]{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 18 #"Generic interfaces"
+0 0 24 3 1 #"}"
+0 0 20 3 2 #"''"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"are"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"higher-level"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"feature"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"among"
+0 0 20 3 13 #" other things"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"allow"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"definition"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"multiple"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"``"
+0 0 20 3 7 #"methods"
+0 0 20 3 2 #"''"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"as"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"part"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 15 #" single generic"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"interface"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"offers"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"friendlier"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"API"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"specifying"
+0 0 20 3 1 #" "
+0 0 20 3 13 #"the ``generic"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"interface"
+0 0 20 3 2 #"''"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"itself"
+0 0 20 3 2 #" ("
+0 0 20 3 4 #"i.e."
+0 0 20 3 1 #" "
+0 0 20 3 4 #"what"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"Object"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"Oriented"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"languages"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"call an "
+0 0 29 3 9 #"interfece"
+0 0 20 3 5 #"), as"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"specifying"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"implementation"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 16 #" said interface."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 13 #"unfortunately"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"offers"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"no"
+0 0 20 3 1 #" "
+0 0 20 3 12 #"support for "
+0 0 29 3 6 #"struct"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 15 #" properties and"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"generic"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"interfaces"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"now."
+0 0 20 3 1 #" "
+0 0 20 3 2 #"It"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"impossible"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"assert"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"that a "
+0 0 29 3 6 #"struct"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 10 #"implements"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"given"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"at"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"level"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"it"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"also"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 12 #" example not"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"possible"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"describe"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"function"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"accepting any "
+0 0 29 3 6 #"struct"
+0 0 20 3 13 #" implementing"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"given"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"property"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"or"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"generic"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"interface."
+0 0 20 3 1 #" "
+0 0 20 3 7 #"Finally"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"no"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"checks"
+0 0 20 3 14 #" are performed"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"on"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"body"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"functions"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"bound"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"such"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"properties"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"check"
+0 0 20 3 14 #" verifies that"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"function"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"implementation"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"with"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"right"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"signature"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"supplied"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 8 #" a given"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 16 #"property. Since "
+0 0 29 3 6 #"struct"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"type"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"properties"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"generics"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"cannot"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"be"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"used"
+0 0 20 3 5 #" in a"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"type-safe"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"way"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"for"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"now"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 2 #"we"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"refrain"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"from"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"using"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"these"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"features"
+0 0 20 3 1 #","
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"only"
+0 0 20 3 9 #" use them"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"implement"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"some"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"very"
+0 0 20 3 18 #" common properties"
+0 0 24 3 1 #"@"
+0 0 14 3 4 #"note"
+0 0 24 3 1 #"{"
+0 0 20 3 2 #"We"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"built"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"a"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"thin"
+0 0 20 3 14 #" macro wrapper"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 13 #"which allows "
+0 0 29 3 12 #"typechecking"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"the"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"implementation"
+0 0 20 3 1 #" "
+0 0 20 3 3 #"and"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"signature"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"of"
+0 0 20 3 14 #" the functions"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 20 3 5 #"bound"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"to"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"these"
+0 0 20 3 16 #" two properties."
+0 0 24 3 1 #"}"
+0 0 20 3 2 #": "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 17 #"prop:custom-write"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 7 #" is the"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"equivalent of "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"java"
+0 0 24 3 1 #"|"
+0 0 20 3 3 #"'s "
+0 0 24 3 1 #"@"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 1 #"\""
+0 0 19 3 4 #"void"
+0 0 19 3 1 #" "
+0 0 19 3 10 #"toString()"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 6 #", and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 15 #"prop:equal+hash"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"which"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"is"
+0 0 20 3 1 #" "
+0 0 20 3 14 #"equivalent to "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"java"
+0 0 24 3 1 #"|"
+0 0 20 3 3 #"'s "
+0 0 24 3 1 #"@"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 1 #"\""
+0 0 19 3 7 #"boolean"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"equals"
+0 0 19 3 1 #"("
+0 0 19 3 6 #"Object"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"o)"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 4 #" and"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 2 #"tt"
+0 0 24 3 1 #"["
+0 0 19 3 1 #"\""
+0 0 19 3 3 #"int"
+0 0 19 3 1 #" "
+0 0 19 3 10 #"hashCode()"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" }"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"["
+0 0 23 3 5 #"#:tag"
+0 0 24 3 1 #" "
+0 0 19 3 26 #"\"tr-presentation-functions"
+0 0 19 3 1 #"\""
+0 0 24 3 2 #"]{"
+0 0 20 3 9 #"Functions"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"supports "
+0 0 20 3 5 #"rich "
+0 0 20 3 9 #"function "
+0 0 20 3 10 #"types, to "
+0 0 20 3 28 #"support some of the flexible"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"use "
+0 0 20 3 27 #"patterns allowed by Racket."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"The "
+0 0 20 3 7 #"simple "
+0 0 20 3 9 #"function "
+0 0 20 3 11 #"type below "
+0 0 20 3 10 #"indicates "
+0 0 20 3 5 #"that "
+0 0 20 3 24 #"the function expects two"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"arguments (an "
+0 0 20 3 45 #"integer and a string), and returns a boolean:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 20 #"We note that unlike "
+0 0 24 3 2 #"@|"
+0 0 14 3 7 #"haskell"
+0 0 24 3 1 #"|"
+0 0 20 3 5 #" and "
+0 0 24 3 2 #"@|"
+0 0 14 3 4 #"CAML"
+0 0 24 3 1 #"|"
+0 0 20 3 12 #" functions, "
+0 0 20 3 20 #"Racket functions are"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"not "
+0 0 20 3 11 #"implicitly "
+0 0 20 3 12 #"curried. To "
+0 0 20 3 8 #"express "
+0 0 20 3 4 #"the "
+0 0 20 3 14 #"corresponding "
+0 0 20 3 22 #"curried function type,"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 16 #"one would write:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 2 #"A "
+0 0 20 3 13 #"function may "
+0 0 20 3 13 #"additionally "
+0 0 20 3 7 #"accept "
+0 0 20 3 9 #"optional "
+0 0 20 3 33 #"positional arguments, and keyword"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 6 #"(i.e. "
+0 0 20 3 7 #"named) "
+0 0 20 3 11 #"arguments, "
+0 0 20 3 28 #"both mandatory and optional:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 9 #"Mandatory"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"string"
+0 0 19 3 1 #","
+0 0 19 3 1 #" "
+0 0 19 3 8 #"optional"
+0 0 19 3 1 #" "
+0 0 19 3 7 #"integer"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"and"
+0 0 19 3 1 #" "
+0 0 19 3 7 #"boolean"
+0 0 19 3 11 #" arguments:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"->*"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"String"
+0 0 24 3 3 #") ("
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #") "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 9 #"Mandatory"
+0 0 19 3 1 #" "
+0 0 19 3 7 #"keyword"
+0 0 19 3 11 #" arguments:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:size"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 23 3 5 #"#:str"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 9 #"Mandatory"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"#:str"
+0 0 19 3 1 #","
+0 0 19 3 1 #" "
+0 0 19 3 8 #"optional"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"#:size"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"and"
+0 0 19 3 7 #" #:opt:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"->*"
+0 0 24 3 2 #" ("
+0 0 23 3 5 #"#:str"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 3 #") ("
+0 0 23 3 6 #"#:size"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 23 3 5 #"#:opt"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #") "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 13 #"Furthermore, "
+0 0 20 3 1 #"f"
+0 0 20 3 8 #"unctions"
+0 0 20 3 1 #" "
+0 0 20 3 2 #"in"
+0 0 20 3 1 #" "
+0 0 20 3 1 #"R"
+0 0 20 3 5 #"acket"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"accept"
+0 0 20 3 37 #" a catch-all ``rest'' argument, which"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"allows "
+0 0 20 3 22 #"for the definition of "
+0 0 29 3 8 #"variadic"
+0 0 20 3 12 #" functions. "
+0 0 20 3 6 #"Typed "
+0 0 20 3 18 #"racket also allows"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 11 #"expressing "
+0 0 20 3 8 #"this at "
+0 0 20 3 4 #"the "
+0 0 20 3 5 #"type "
+0 0 20 3 10 #"level, as "
+0 0 20 3 8 #"long as "
+0 0 20 3 28 #"the arguments covered by the"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"``rest'' "
+0 0 20 3 11 #"clause all "
+0 0 20 3 5 #"have "
+0 0 20 3 14 #"the same type:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 3 #"The"
+0 0 19 3 1 #" "
+0 0 19 3 8 #"function"
+0 0 19 3 1 #" "
+0 0 19 3 7 #"accepts"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"one"
+0 0 19 3 1 #" "
+0 0 19 3 7 #"integer"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"and"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"any"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"number"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"of"
+0 0 19 3 9 #" strings:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 2 #"->"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"*"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 4 #"Same"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"thing"
+0 0 19 3 1 #" "
+0 0 19 3 4 #"with"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"an"
+0 0 19 3 1 #" "
+0 0 19 3 8 #"optional"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"symbol"
+0 0 19 3 1 #" "
+0 0 19 3 11 #"inbetween: "
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"->*"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"Integer"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"Symbol"
+0 0 24 3 2 #") "
+0 0 23 3 6 #"#:rest"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #")]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"One of "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 31 #"'s main goals is to be able to "
+0 0 29 3 9 #"typecheck"
+0 0 20 3 10 #" idiomatic"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"Racket "
+0 0 20 3 10 #"programs. "
+0 0 20 3 5 #"Such "
+0 0 20 3 13 #"programs may "
+0 0 20 3 8 #"include "
+0 0 20 3 10 #"functions "
+0 0 20 3 6 #"whose "
+0 0 20 3 19 #"return type depends"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"on "
+0 0 20 3 4 #"the "
+0 0 20 3 10 #"values of "
+0 0 20 3 32 #"the input arguments. Similarly, "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 15 3 11 #"case-lambda"
+0 0 24 3 1 #"]"
+0 0 20 3 7 #" can be"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 32 #"used to create lambda functions "
+0 0 20 3 6 #"which "
+0 0 20 3 12 #"dispatch to "
+0 0 20 3 28 #"multiple behaviours based on"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"the number of "
+0 0 20 3 33 #"arguments passed to the function."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 14 #" provides the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"case\342\206\222"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 35 #"type operator, which can be used to"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"describe "
+0 0 20 3 4 #"the "
+0 0 20 3 24 #"type of these functions:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 6 #"Allows"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"1"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"or"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"3"
+0 0 19 3 1 #" "
+0 0 19 3 9 #"arguments"
+0 0 19 3 1 #","
+0 0 19 3 1 #" "
+0 0 19 3 4 #"with"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"the"
+0 0 19 3 1 #" "
+0 0 19 3 4 #"same"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"return"
+0 0 19 3 6 #" type."
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"case\342\206\222"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 1 #"A"
+0 0 19 3 1 #" "
+0 0 19 3 7 #"similar"
+0 0 19 3 1 #" "
+0 0 19 3 4 #"type"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"based"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"on"
+0 0 19 3 1 #" "
+0 0 19 3 8 #"optional"
+0 0 19 3 1 #" "
+0 0 19 3 9 #"arguments"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"allows"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"1"
+0 0 19 3 1 #","
+0 0 19 3 1 #" "
+0 0 19 3 1 #"2"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"or"
+0 0 19 3 2 #" 3"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 1 #" "
+0 0 19 3 9 #"arguments"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"in"
+0 0 19 3 10 #" contrast:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"->*"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"Integer"
+0 0 24 3 3 #") ("
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 2 #") "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 3 #"The"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"output"
+0 0 19 3 1 #" "
+0 0 19 3 4 #"type"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"can"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"depend"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"on"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"the"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"input"
+0 0 19 3 6 #" type:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"case\342\206\222"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 4 #"Both"
+0 0 19 3 1 #" "
+0 0 19 3 8 #"features"
+0 0 19 3 2 #" ("
+0 0 19 3 5 #"arity"
+0 0 19 3 1 #" "
+0 0 19 3 3 #"and"
+0 0 19 3 1 #" "
+0 0 19 3 9 #"dependent"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"output"
+0 0 19 3 1 #" "
+0 0 19 3 4 #"type"
+0 0 19 3 2 #") "
+0 0 19 3 3 #"can"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"be"
+0 0 19 3 6 #" mixed"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"case\342\206\222"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 9 #" ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Listof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 4 #")))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"Another "
+0 0 20 3 19 #"important feature, "
+0 0 20 3 13 #"which can be "
+0 0 20 3 9 #"found in "
+0 0 20 3 23 #"the type system of most"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 11 #"functional "
+0 0 20 3 12 #"programming "
+0 0 20 3 49 #"languages, and most object-oriented languages, is"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 25 #"parametric polymorphism. "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 1 #" "
+0 0 20 3 7 #"allows "
+0 0 20 3 29 #"the definition of polymorphic"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 29 3 7 #"structs"
+0 0 20 3 5 #", as "
+0 0 20 3 19 #"detailed above, as "
+0 0 20 3 8 #"well as "
+0 0 20 3 12 #"polymorphic "
+0 0 20 3 27 #"functions. For example, the"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"function "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #"]"
+0 0 20 3 35 #" can be considered as a polymorphic"
+0 0 20 3 10 #" function "
+0 0 20 3 4 #"with"
+0 0 20 3 4 #" two"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 11 #"polymorphic"
+0 0 20 3 1 #" "
+0 0 20 3 15 #"type arguments "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"A"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"B"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 20 3 24 #" which takes an argument"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"of type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"A"
+0 0 24 3 1 #"]"
+0 0 20 3 22 #", an argument of type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"B"
+0 0 24 3 1 #"]"
+0 0 20 3 23 #", and returns a pair of"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"A"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"B"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #"."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\210\200"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"B"
+0 0 24 3 3 #") ("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"B"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"A"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"B"
+0 0 24 3 4 #")))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 5 #"htodo"
+0 0 24 3 1 #"{"
+0 0 20 3 13 #"Something on "
+0 0 20 3 54 #"which types can be inferred and which can't (for now)."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 9 #"Finally, "
+0 0 20 3 12 #"predicates ("
+0 0 20 3 10 #"functions "
+0 0 20 3 36 #"whose results can be interpreted as "
+0 0 29 3 8 #"booleans"
+0 0 20 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 15 #"can be used to "
+0 0 20 3 5 #"gain "
+0 0 20 3 12 #"information "
+0 0 20 3 6 #"about "
+0 0 20 3 4 #"the "
+0 0 20 3 8 #"type of "
+0 0 20 3 28 #"their argument, depending on"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"the "
+0 0 20 3 12 #"result. The "
+0 0 20 3 10 #"type of a "
+0 0 20 3 52 #"predicate can include positive and negative filters,"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 15 #"indicated with "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 23 3 3 #"#:+"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 23 3 3 #"#:-"
+0 0 24 3 1 #"]"
+0 0 20 3 31 #", respectively. The type of the"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"string?"
+0 0 24 3 1 #"]"
+0 0 20 3 14 #" predicate is:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"\342\206\222"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"Any"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Boolean"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 1 #" "
+0 0 23 3 3 #"#:+"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 23 3 3 #"#:-"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"!"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 3 #"))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"In "
+0 0 20 3 5 #"this "
+0 0 20 3 10 #"notation, "
+0 0 20 3 20 #"the positive filter "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 23 3 3 #"#:+"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #"]"
+0 0 20 3 20 #" indicates that when"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 22 #"the predicate returns "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 5 #"#true"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #", "
+0 0 20 3 29 #"the argument is known to be a"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"String"
+0 0 24 3 1 #"]"
+0 0 20 3 19 #". Conversely, when "
+0 0 20 3 4 #"the "
+0 0 20 3 21 #"predicate exits with "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 21 3 6 #"#false"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 20 #"the negative filter "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 23 3 3 #"#:-"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"!"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 2 #")]"
+0 0 20 3 11 #" indicates "
+0 0 20 3 5 #"that "
+0 0 20 3 19 #"the input could not"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 1 #"("
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"!"
+0 0 24 3 1 #"]"
+0 0 20 3 2 #") "
+0 0 20 3 9 #"possibly "
+0 0 20 3 12 #"have been a "
+0 0 20 3 12 #"string. The "
+0 0 20 3 12 #"information "
+0 0 20 3 15 #"gained this way"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 7 #"allows "
+0 0 20 3 20 #"regular conditionals"
+0 0 20 3 1 #" "
+0 0 20 3 9 #"based on "
+0 0 20 3 33 #"arbitrary predicates to work like"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 17 #"pattern-matching:"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 8 #"examples"
+0 0 24 3 1 #"["
+0 0 23 3 7 #"#:label"
+0 0 24 3 1 #" "
+0 0 21 3 2 #"#f"
+0 0 24 3 1 #" "
+0 0 23 3 6 #"#:eval"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"tr-eval"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 13 #" ("
+0 0 15 3 6 #"define"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"f"
+0 0 24 3 2 #" ["
+0 0 14 3 1 #"x"
+0 0 24 3 1 #" "
+0 0 14 3 1 #":"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 3 #")])"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 14 3 2 #"if"
+0 0 24 3 2 #" ("
+0 0 14 3 7 #"string?"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 19 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 1 #"x"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"is"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"known"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"to"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"be"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"a"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"String"
+0 0 19 3 6 #" here:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 19 #" ("
+0 0 14 3 3 #"ann"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 19 #" ("
+0 0 14 3 12 #"code:comment"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 1 #"x"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"is"
+0 0 19 3 1 #" "
+0 0 19 3 5 #"known"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"to"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"be"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"a"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"Number"
+0 0 19 3 1 #" "
+0 0 19 3 2 #"or"
+0 0 19 3 1 #" "
+0 0 19 3 1 #"a"
+0 0 19 3 1 #" "
+0 0 19 3 6 #"Symbol"
+0 0 19 3 6 #" here:"
+0 0 19 3 1 #"\""
+0 0 24 3 1 #")"
+0 0 24 29 1 #"\n"
+0 0 24 3 19 #" ("
+0 0 14 3 3 #"ann"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"x"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Number"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"Symbol"
+0 0 24 3 5 #"))))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 4 #"The "
+0 0 20 3 20 #"propositions do not "
+0 0 20 3 12 #"necessarily "
+0 0 20 3 8 #"need to "
+0 0 20 3 9 #"refer to "
+0 0 20 3 21 #"the value as a whole,"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 8 #"and can "
+0 0 20 3 8 #"instead "
+0 0 20 3 5 #"give "
+0 0 20 3 12 #"information "
+0 0 20 3 8 #"about a "
+0 0 20 3 8 #"sub-part"
+0 0 20 3 4 #" of "
+0 0 20 3 25 #"the value. Right now, the"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"user "
+0 0 20 3 14 #"interface for "
+0 0 20 3 21 #"specifying paths can "
+0 0 20 3 5 #"only "
+0 0 20 3 7 #"target "
+0 0 20 3 4 #"the "
+0 0 20 3 22 #"left and right members"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 4 #"cons"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 32 #"pairs, recursively. Internally, "
+0 0 24 3 2 #"@|"
+0 0 14 3 11 #"typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 9 #" supports"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 14 #"richer paths, "
+0 0 20 3 4 #"and "
+0 0 20 3 1 #"t"
+0 0 20 3 3 #"he "
+0 0 20 3 4 #"type"
+0 0 20 3 15 #" inference can "
+0 0 20 3 8 #"produce "
+0 0 20 3 18 #"filters which give"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 11 #"information"
+0 0 20 3 1 #" "
+0 0 20 3 5 #"about"
+0 0 20 3 1 #" "
+0 0 20 3 10 #"individual"
+0 0 20 3 22 #" structure fields, or "
+0 0 20 3 6 #"about "
+0 0 20 3 20 #"the result of forced"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 22 #"promises, for example."
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"["
+0 0 23 3 5 #"#:tag"
+0 0 24 3 1 #" "
+0 0 19 3 1 #"\""
+0 0 19 3 32 #"tr-presentation-recursive-types\""
+0 0 24 3 2 #"]{"
+0 0 20 3 15 #"Recursive types"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 4 #" @|"
+0 0 14 3 11 #"Typedracket"
+0 0 24 3 1 #"|"
+0 0 20 3 8 #" allows "
+0 0 20 3 10 #"recursive "
+0 0 20 3 7 #"types, "
+0 0 20 3 10 #"both via ("
+0 0 20 3 8 #"possibly"
+0 0 20 3 1 #" "
+0 0 20 3 19 #"mutually-recursive)"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"named"
+0 0 20 3 27 #" declarations, and via the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"Rec"
+0 0 24 3 1 #"]"
+0 0 20 3 15 #" type operator."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"In "
+0 0 20 3 14 #"the following "
+0 0 20 3 20 #"examples, the types "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"Foo"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"Bar"
+0 0 24 3 1 #"]"
+0 0 20 3 4 #" are"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 29 #"mutually recursive. The type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"Foo"
+0 0 24 3 1 #"]"
+0 0 20 3 9 #" matches "
+0 0 20 3 6 #"lists "
+0 0 20 3 22 #"with an even number of"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 12 #"alternating "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #"]"
+0 0 20 3 5 #" and "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 6 #"String"
+0 0 24 3 1 #"]"
+0 0 20 3 27 #" elements, starting with an"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #","
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 15 3 11 #"define-type"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"Foo"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"Bar"
+0 0 24 3 2 #"))"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 15 3 11 #"define-type"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"Bar"
+0 0 24 3 2 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 3 2 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 14 3 3 #"Foo"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"Null"
+0 0 24 3 4 #")))]"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 5 #"This "
+0 0 20 3 5 #"same "
+0 0 20 3 5 #"type "
+0 0 20 3 6 #"could "
+0 0 20 3 17 #"alternatively be "
+0 0 20 3 18 #"defined using the "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 3 #"Rec"
+0 0 24 3 1 #"]"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 23 #"operator. The notation "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 2 #"[("
+0 0 14 3 3 #"Rec"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"R"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"T"
+0 0 24 3 2 #")]"
+0 0 20 3 1 #" "
+0 0 20 3 16 #"builds the type "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"T"
+0 0 24 3 1 #"]"
+0 0 20 3 7 #", where"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 15 #"occurrences of "
+0 0 24 3 1 #"@"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"R"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 4 #"are "
+0 0 20 3 39 #"interpreted as recursive occurrences of"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"racket"
+0 0 24 3 1 #"["
+0 0 14 3 1 #"T"
+0 0 24 3 1 #"]"
+0 0 20 3 8 #" itself."
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 11 #"racketblock"
+0 0 24 3 1 #"["
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" ("
+0 0 14 3 3 #"Rec"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"R"
+0 0 24 29 1 #"\n"
+0 0 24 3 7 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 7 #"Integer"
+0 0 24 29 1 #"\n"
+0 0 24 3 15 #" ("
+0 0 14 3 6 #"Pairof"
+0 0 24 3 1 #" "
+0 0 14 3 6 #"String"
+0 0 24 29 1 #"\n"
+0 0 24 3 23 #" ("
+0 0 14 3 1 #"U"
+0 0 24 3 1 #" "
+0 0 14 3 1 #"R"
+0 0 24 3 1 #" "
+0 0 14 3 4 #"Null"
+0 0 24 3 6 #"))))]}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 7 #"Classes"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 3 #"The"
+0 0 20 3 1 #" "
+0 0 24 3 1 #"@"
+0 0 14 3 13 #"racketmodname"
+0 0 24 3 1 #"["
+0 0 14 3 12 #"racket/class"
+0 0 24 3 1 #"]"
+0 0 20 3 1 #" "
+0 0 20 3 6 #"module"
+0 0 20 3 1 #" "
+0 0 20 3 8 #"provides"
+0 0 20 3 30 #" an object-oriented system for"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 11 #"Racket. It "
+0 0 20 3 9 #"supports "
+0 0 20 3 4 #"the "
+0 0 20 3 14 #"definition of "
+0 0 20 3 8 #"classes "
+0 0 20 3 5 #"with "
+0 0 20 3 12 #"methods and "
+0 0 20 3 7 #"fields."
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" "
+0 0 20 3 26 #"We will not describe this "
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" }"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 17 #"Occurrence typing"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" }"
+0 0 24 29 1 #"\n"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" @"
+0 0 14 3 8 #"asection"
+0 0 24 3 1 #"{"
+0 0 24 29 1 #"\n"
+0 0 24 3 3 #" @"
+0 0 14 3 6 #"atitle"
+0 0 24 3 1 #"{"
+0 0 20 3 21 #"Global type inference"
+0 0 24 3 1 #"}"
+0 0 24 29 1 #"\n"
+0 0 24 3 2 #" }"
+0 0 24 29 1 #"\n"
+0 0 24 3 1 #"}"
+0 0