#reader(lib"read.ss""wxme")WXME0110 ## #| This file uses the GRacket editor format. Open this file in DrRacket version 8.2 or later to read it. 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). http://racket-lang.org/ |# 34 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 (0 68 ((lib "image-core.ss" "mrlib") (lib "image-core-wxme.rkt" "mrlib")) ) 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 79 (1 79 ((lib "srcloc-snip.rkt" "framework") (lib "wxme-srcloc-snip.rkt" "framework")) ) 1 0 93 (2 93 ((lib "collapsed-snipclass.ss" "framework") (lib "collapsed-snipclass-wxme.ss" "framework")) ) 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 (3 101 ((lib "ellipsis-snip.rkt" "drracket" "private") (lib "ellipsis-snip-wxme.rkt" "drracket" "private")) ) 2 0 88 (4 88 ((lib "pict-snip.rkt" "drracket" "private") (lib "pict-snip.rkt" "drracket" "private")) ) 1 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 26 #"drscheme:pict-value-snip%\0" 0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0" 1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0" 2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0" 1 0 18 #"drscheme:xml-snip\0" 1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0" 1 0 21 #"drscheme:scheme-snip\0" 2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0" 1 0 10 #"text-box%\0" 1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0" 1 0 1 6 #"wxloc\0" 0 0 66 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 6 #"Menlo\0" 0 33 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 26 #"plt:htdp: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 27 #"plt:htdp: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 70 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 4 #"XML\0" 0 70 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 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 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 0 36 #"mrlib/syntax-browser:subtitle-color\0" 0 -1 1 #"\0" 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 36 36 140 255 255 255 -1 -1 0 42 #"mrlib/syntax-browser:focused-syntax-color\0" 0 -1 1 #"\0" 1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 34 139 34 255 255 255 -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 4 1 #"\0" 0 -1 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 0 -1 0 1 #"\0" 0 -1 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 0 -1 2 1 #"\0" 1 51 59 1 #"\0" 0 -1 1 #"\0" 1.0 0 92 -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 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 0 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 175 0 0 0 -1 -1 0 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 150 0 150 0 0 0 -1 -1 4 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 175 0 0 0 -1 -1 4 1 #"\0" 0 -1 1 #"\0" 1.0 0 -1 -1 -1 93 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 175 0 0 0 -1 -1 0 2404 0 4 3 85 (5 85 ;; The first three lines of this file were inserted by DrRacket. They record metadata ) 0 0 4 29 1 #"\n" 0 0 4 3 85 (6 85 ;; about the language level of this file in a form that our tools can easily process. ) 0 0 4 29 1 #"\n" 0 0 4 3 191 (7 191 #reader(lib "htdp-beginner-reader.ss" "lang")((modname |#textbox-demo-after|) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f () #f))) ) 0 0 4 29 1 #"\n" 0 0 17 3 95 (8 95 ;;; This is an alternate implementation of a `textbox` struct (see `textbox-demo.rkt` for v.1). ) 0 0 24 29 1 #"\n" 0 0 17 3 3 #";;;" 0 0 24 29 1 #"\n" 0 0 17 3 30 #";;; Major differences from v1:" 0 0 24 29 1 #"\n" 0 0 17 3 47 #";;; - a natural, good use of helper-functions" 0 0 24 29 1 #"\n" 0 0 17 3 99 (9 99 ;;; (including their own tests, but (a) allowing re-use, and (b) making debugging 1000x easier) ) 0 0 24 29 1 #"\n" 0 0 17 3 102 (10 102 ;;; - different representation/fields: rather than text & cursor-location, use left- and right-text. ) 0 0 24 29 1 #"\n" 0 0 17 3 59 #";;; - use named-constants, for the image-drawing details." 0 0 24 29 1 #"\n" 0 0 17 3 3 #";;;" 0 0 24 29 1 #"\n" 0 0 17 3 66 #";;; (You may uncomment the 'big-bang' call at very end, to demo." 0 0 24 29 1 #"\n" 0 0 17 3 51 #";;; But only do that AFTER all test-cases pass!)" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 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 14 3 11 #"2htdp/image" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 7 #"require" 0 0 24 3 1 #" " 0 0 14 3 14 #"2htdp/universe" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 69 (11 69 ; A few shorter names for standard string functions, for convenience: ) 0 0 24 29 1 #"\n" 0 0 17 3 42 #";(define (substr s a b) (substring s a b))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 1 #" " 0 0 14 3 2 #"s1" 0 0 24 3 1 #" " 0 0 14 3 2 #"s2" 0 0 24 3 3 #") (" 0 0 14 3 13 #"string-append" 0 0 24 3 1 #" " 0 0 14 3 2 #"s1" 0 0 24 3 1 #" " 0 0 14 3 2 #"s2" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 6 #"strlen" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 3 #") (" 0 0 14 3 13 #"string-length" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 17 3 83 (12 83 ; Renaming standard functions is DUBIOUS practice, esp. working on teams/companies. ) 0 0 24 29 1 #"\n" 0 0 17 3 72 (13 72 ; If there is a standard-name, you should use it, even if it annoys you. ) 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 30 #"; str* : nat, string -> string" 0 0 24 29 1 #"\n" 0 0 17 3 37 #"; return `n` copies of `s`, appended." 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 14 3 1 #"n" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 15 3 4 #"cond" 0 0 24 3 3 #" [(" 0 0 14 3 5 #"zero?" 0 0 24 3 1 #" " 0 0 14 3 1 #"n" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 9 #" [" 0 0 14 3 4 #"else" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 2 #" (" 0 0 14 3 4 #"sub1" 0 0 24 3 1 #" " 0 0 14 3 1 #"n" 0 0 24 3 2 #") " 0 0 14 3 1 #"s" 0 0 24 3 5 #"))]))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"cat\"" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"cat\"" 0 0 24 3 2 #") " 0 0 19 3 5 #"\"cat\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 21 3 1 #"3" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 21 3 1 #"3" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"cat\"" 0 0 24 3 2 #") " 0 0 19 3 11 #"\"catcatcat\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 38 #"; clamp : real?, real?, real? -> real?" 0 0 24 29 1 #"\n" 0 0 17 3 49 #"; Return x, except clamped to the interval [a,b]." 0 0 24 29 1 #"\n" 0 0 17 3 67 #"; (That is, the closest number to x which is in [a,b] inclusive.)" 0 0 24 29 1 #"\n" 0 0 17 3 15 #"; @pre (<= a b)" 0 0 24 29 1 #"\n" 0 0 17 3 73 (14 73 ; Note: Beginning-student does not contain nan.0, but if it did this code ) 0 0 24 29 1 #"\n" 0 0 17 3 30 #"; would be weird in that case." 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 14 3 1 #"a" 0 0 24 3 1 #" " 0 0 14 3 1 #"x" 0 0 24 3 1 #" " 0 0 14 3 1 #"b" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 15 3 4 #"cond" 0 0 24 3 3 #" [(" 0 0 14 3 2 #"<=" 0 0 24 3 1 #" " 0 0 14 3 1 #"a" 0 0 24 3 1 #" " 0 0 14 3 1 #"x" 0 0 24 3 1 #" " 0 0 14 3 1 #"b" 0 0 24 3 2 #") " 0 0 14 3 1 #"x" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" [(" 0 0 14 3 3 #"not" 0 0 24 3 2 #" (" 0 0 14 3 2 #"<=" 0 0 24 3 1 #" " 0 0 14 3 1 #"a" 0 0 24 3 1 #" " 0 0 14 3 1 #"x" 0 0 24 3 3 #")) " 0 0 14 3 1 #"a" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" [(" 0 0 14 3 3 #"not" 0 0 24 3 2 #" (" 0 0 14 3 2 #"<=" 0 0 24 3 1 #" " 0 0 14 3 1 #"x" 0 0 24 3 1 #" " 0 0 14 3 1 #"b" 0 0 24 3 3 #")) " 0 0 14 3 1 #"b" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 9 #" [" 0 0 14 3 4 #"else" 0 0 24 3 2 #" (" 0 0 14 3 5 #"error" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 19 3 36 #"\"violated pre-condition: first arg \"" 0 0 24 3 1 #" " 0 0 14 3 1 #"a" 0 0 24 3 1 #" " 0 0 19 3 14 #"\" must be <= \"" 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 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 21 3 1 #"3" 0 0 24 3 1 #" " 0 0 21 3 1 #"5" 0 0 24 3 2 #") " 0 0 21 3 1 #"3" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 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 2 #") " 0 0 21 3 1 #"1" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 21 3 1 #"7" 0 0 24 3 1 #" " 0 0 21 3 1 #"5" 0 0 24 3 2 #") " 0 0 21 3 1 #"5" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 21 3 1 #"5" 0 0 24 3 2 #") " 0 0 21 3 1 #"1" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 21 3 1 #"5" 0 0 24 3 1 #" " 0 0 21 3 1 #"5" 0 0 24 3 2 #") " 0 0 21 3 1 #"5" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 21 3 6 #"+inf.0" 0 0 24 3 1 #" " 0 0 21 3 1 #"5" 0 0 24 3 2 #") " 0 0 21 3 1 #"5" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 6 #"-inf.0" 0 0 24 3 1 #" " 0 0 21 3 9 #"777777777" 0 0 24 3 1 #" " 0 0 21 3 6 #"+inf.0" 0 0 24 3 2 #") " 0 0 21 3 9 #"777777777" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 9 #"infinite?" 0 0 24 3 1 #" " 0 0 14 3 1 #"x" 0 0 24 3 3 #") (" 0 0 14 3 1 #"=" 0 0 24 3 2 #" (" 0 0 14 3 3 #"abs" 0 0 24 3 1 #" " 0 0 14 3 1 #"x" 0 0 24 3 2 #") " 0 0 21 3 6 #"+inf.0" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 15 #"check-satisfied" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 6 #"-inf.0" 0 0 24 3 1 #" " 0 0 21 3 6 #"+inf.0" 0 0 24 3 1 #" " 0 0 21 3 6 #"+inf.0" 0 0 24 3 2 #") " 0 0 14 3 9 #"infinite?" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 15 #"check-satisfied" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 6 #"-inf.0" 0 0 24 3 1 #" " 0 0 21 3 6 #"-inf.0" 0 0 24 3 1 #" " 0 0 21 3 6 #"+inf.0" 0 0 24 3 2 #") " 0 0 14 3 9 #"infinite?" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 56 #"; substr/safe : string, natnum, natum-or-inf.0 -> string" 0 0 24 29 1 #"\n" 0 0 17 3 64 #"; Like substring, but if `a` or `b` aren't valid indices of `s`," 0 0 24 29 1 #"\n" 0 0 17 3 46 #"; just grab 'til the start/end of `s` instead." 0 0 24 29 1 #"\n" 0 0 17 3 66 #"; As a special case, `b` may be +inf.0, to take to the end-of-`s`." 0 0 24 29 1 #"\n" 0 0 17 3 56 #"; pre-condition: (and (<= a (string-length s)) (>= b 0))" 0 0 24 29 1 #"\n" 0 0 17 3 76 (15 76 ; (Note/bug: I should relax this pre-condition, after `let*` introduced.) ) 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 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 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 14 3 9 #"substring" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 2 #" (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 1 #" " 0 0 14 3 1 #"a" 0 0 24 3 2 #" (" 0 0 14 3 6 #"strlen" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 4 #")) (" 0 0 14 3 5 #"clamp" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 1 #" " 0 0 14 3 1 #"b" 0 0 24 3 2 #" (" 0 0 14 3 6 #"strlen" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 4 #"))))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 1 #"2" 0 0 24 3 1 #" " 0 0 21 3 1 #"4" 0 0 24 3 2 #") " 0 0 19 3 4 #"\"ll\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 1 #"2" 0 0 24 3 1 #" " 0 0 21 3 2 #"19" 0 0 24 3 2 #") " 0 0 19 3 5 #"\"llo\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 1 #"2" 0 0 24 3 1 #" " 0 0 21 3 6 #"+inf.0" 0 0 24 3 2 #") " 0 0 19 3 5 #"\"llo\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 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 2 #") " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 2 #"-2" 0 0 24 3 1 #" " 0 0 21 3 2 #"44" 0 0 24 3 2 #") " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 2 #"-2" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 2 #") " 0 0 19 3 3 #"\"h\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 2 #"92" 0 0 24 3 1 #" " 0 0 21 3 2 #"95" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 2 #"-7" 0 0 24 3 1 #" " 0 0 21 3 2 #"-3" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 2 #"-5" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 21 3 2 #"-5" 0 0 24 3 1 #" " 0 0 21 3 2 #"17" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 8 #"str-last" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 3 #") (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 2 #" (" 0 0 14 3 4 #"sub1" 0 0 24 3 2 #" (" 0 0 14 3 6 #"strlen" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 3 #")) " 0 0 21 3 6 #"+inf.0" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 13 #"str-drop-last" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 3 #") (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 2 #" (" 0 0 14 3 4 #"sub1" 0 0 24 3 2 #" (" 0 0 14 3 6 #"strlen" 0 0 24 3 1 #" " 0 0 14 3 1 #"s" 0 0 24 3 4 #"))))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 8 #"str-last" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 8 #"str-last" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"a\"" 0 0 24 3 2 #") " 0 0 19 3 3 #"\"a\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 8 #"str-last" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 2 #") " 0 0 19 3 3 #"\"o\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 13 #"str-drop-last" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 13 #"str-drop-last" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"a\"" 0 0 24 3 2 #") " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 13 #"str-drop-last" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 2 #") " 0 0 19 3 6 #"\"hell\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 41 #"; has-prefix? : string, string -> boolean" 0 0 24 29 1 #"\n" 0 0 17 3 46 #"; Does `a` start with (the characters of) `b`?" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 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 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 14 3 8 #"string=?" 0 0 24 3 2 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 1 #" " 0 0 14 3 1 #"a" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 2 #" (" 0 0 14 3 6 #"strlen" 0 0 24 3 1 #" " 0 0 14 3 1 #"b" 0 0 24 3 3 #")) " 0 0 14 3 1 #"b" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 21 3 5 #"#true" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"cathay\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 21 3 5 #"#true" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"cathay\"" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"cat\"" 0 0 24 3 2 #") " 0 0 21 3 5 #"#true" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"cathay\"" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"cathay\"" 0 0 24 3 2 #") " 0 0 21 3 5 #"#true" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"y\"" 0 0 24 3 2 #") " 0 0 21 3 6 #"#false" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"shorty\"" 0 0 24 3 1 #" " 0 0 19 3 17 #"\"longy mclongstr\"" 0 0 24 3 2 #") " 0 0 21 3 6 #"#false" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"x\"" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"y\"" 0 0 24 3 2 #") " 0 0 21 3 6 #"#false" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"cathay\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"catz\"" 0 0 24 3 2 #") " 0 0 21 3 6 #"#false" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"cathay\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"dogo\"" 0 0 24 3 2 #") " 0 0 21 3 6 #"#false" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 80 (16 80 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ) 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 17 #"; Datatype def'n:" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 13 #"define-struct" 0 0 24 3 1 #" " 0 0 14 3 7 #"textbox" 0 0 24 3 2 #" (" 0 0 14 3 1 #"l" 0 0 24 3 1 #" " 0 0 14 3 1 #"r" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 17 3 42 #"; make-textbox : string, string -> textbox" 0 0 24 29 1 #"\n" 0 0 17 3 93 (17 93 ; interpretation: `l` is the text to the left of the cursor; `r` is the text to the right. ) 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 77 (18 77 ; Recall: racket auto-creates constructor as above, getters, and a predicate: ) 0 0 24 29 1 #"\n" 0 0 17 3 41 #"; textbox-contents : textbox -> string" 0 0 24 29 1 #"\n" 0 0 17 3 42 #"; textbox-cursor : textbox -> natural" 0 0 24 29 1 #"\n" 0 0 17 3 30 #"; textbox? : ANY -> boolean" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 18 #"; examples of data" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 3 #") " 0 0 17 3 27 #"; cursor before entire word" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"h\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"ello\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hel\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"h\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"h\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 2 #" (" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-l" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 3 #") (" 0 0 14 3 9 #"textbox-l" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-r" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 3 #") (" 0 0 14 3 9 #"textbox-r" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 14 3 1 #"l" 0 0 24 3 1 #" " 0 0 14 3 1 #"r" 0 0 24 3 3 #") (" 0 0 14 3 12 #"make-textbox" 0 0 24 3 1 #" " 0 0 14 3 1 #"l" 0 0 24 3 1 #" " 0 0 14 3 1 #"r" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 11 #"; template:" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 35 #"; func-for-textbox : textbox -> ???" 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 16 #"func-for-textbox" 0 0 24 3 1 #" " 0 0 14 3 5 #"a-box" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 14 3 3 #"..." 0 0 24 3 2 #" (" 0 0 14 3 9 #"textbox-l" 0 0 24 3 1 #" " 0 0 14 3 5 #"a-box" 0 0 24 3 2 #") " 0 0 14 3 3 #"..." 0 0 24 3 2 #" (" 0 0 14 3 9 #"textbox-r" 0 0 24 3 1 #" " 0 0 14 3 5 #"a-box" 0 0 24 3 2 #") " 0 0 14 3 3 #"..." 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 12 #";===========" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #") " 0 0 19 3 7 #"\"right\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 2 #") " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 2 #") " 0 0 19 3 4 #"\"\\b\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hel\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 2 #") " 0 0 19 3 3 #"\"z\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"helz\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hel\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 2 #") " 0 0 19 3 7 #"\"right\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"hell\"" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"o\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hel\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 2 #") " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"he\"" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"llo\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hel\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 2 #") " 0 0 19 3 4 #"\"\\b\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"he\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 1 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"z\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 3 #"\"z\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 1 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 14 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 1 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"right\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 14 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 1 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"\\b\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 14 #" " 0 0 14 3 13 #"EMPTY-TEXTBOX" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 52 #"; tbox-handle-key : textbox?, key-event? -> textbox?" 0 0 24 29 1 #"\n" 0 0 17 3 42 #"; Update `a-textbox` to incorporate `key`." 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 1 #" " 0 0 14 3 3 #"key" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 15 3 4 #"cond" 0 0 24 3 3 #" [(" 0 0 14 3 5 #"key=?" 0 0 24 3 1 #" " 0 0 14 3 3 #"key" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"right\"" 0 0 24 3 3 #") (" 0 0 14 3 4 #"tbox" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-l" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 3 #") (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-r" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 2 #") " 0 0 21 3 1 #"0" 0 0 24 3 1 #" " 0 0 21 3 1 #"1" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 36 #" (" 0 0 14 3 11 #"substr/safe" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-r" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 2 #") " 0 0 21 3 1 #"1" 0 0 24 3 1 #" " 0 0 21 3 6 #"+inf.0" 0 0 24 3 3 #"))]" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" [(" 0 0 14 3 5 #"key=?" 0 0 24 3 1 #" " 0 0 14 3 3 #"key" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"left\"" 0 0 24 3 4 #") (" 0 0 14 3 4 #"tbox" 0 0 24 3 2 #" (" 0 0 14 3 13 #"str-drop-last" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-l" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 36 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 2 #" (" 0 0 14 3 8 #"str-last" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-l" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 4 #")) (" 0 0 14 3 6 #"tbox-r" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 4 #")))]" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" [(" 0 0 14 3 5 #"key=?" 0 0 24 3 1 #" " 0 0 14 3 3 #"key" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"\\b\"" 0 0 24 3 6 #") (" 0 0 14 3 4 #"tbox" 0 0 24 3 2 #" (" 0 0 14 3 13 #"str-drop-last" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-l" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 36 #" (" 0 0 14 3 6 #"tbox-r" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 3 #"))]" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" [(" 0 0 14 3 1 #">" 0 0 24 3 2 #" (" 0 0 14 3 6 #"strlen" 0 0 24 3 1 #" " 0 0 14 3 3 #"key" 0 0 24 3 2 #") " 0 0 21 3 1 #"1" 0 0 24 3 2 #") " 0 0 14 3 6 #"a-tbox" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 9 #" [" 0 0 14 3 4 #"else" 0 0 24 3 17 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-l" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 2 #") " 0 0 14 3 3 #"key" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 36 #" (" 0 0 14 3 6 #"tbox-r" 0 0 24 3 1 #" " 0 0 14 3 6 #"a-tbox" 0 0 24 3 5 #"))]))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 5 #"BOX-H" 0 0 24 3 1 #" " 0 0 21 3 3 #"100" 0 0 24 3 14 #") " 0 0 17 3 61 #"; height of the drawn text-box, in px (as per image library)." 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 5 #"BOX-W" 0 0 24 3 1 #" " 0 0 21 3 3 #"800" 0 0 24 3 13 #") " 0 0 17 3 39 #"; minimum width of the text-box, in px." 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 3 #"BOX" 0 0 24 3 2 #" (" 0 0 14 3 9 #"rectangle" 0 0 24 3 1 #" " 0 0 14 3 5 #"BOX-W" 0 0 24 3 1 #" " 0 0 14 3 5 #"BOX-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 7 #"outline" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 5 #"green" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 14 3 5 #"BOX-H" 0 0 24 3 10 #") " 0 0 17 3 46 #"; font-size (height of a typical char), in px." 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 8 #"CURSOR-H" 0 0 24 3 2 #" (" 0 0 14 3 1 #"*" 0 0 24 3 1 #" " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 3 #"0.8" 0 0 24 3 3 #")) " 0 0 17 3 30 #"; height of our cursor, in px." 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 6 #"CURSOR" 0 0 24 3 2 #" (" 0 0 14 3 9 #"rectangle" 0 0 24 3 1 #" " 0 0 21 3 1 #"2" 0 0 24 3 1 #" " 0 0 14 3 8 #"CURSOR-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 5 #"solid" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 6 #"orange" 0 0 24 3 3 #")) " 0 0 17 3 18 #"; the cursor-image" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 9 #"draw-tbox" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hel\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 13 #"overlay/align" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"center\"" 0 0 24 29 1 #"\n" 0 0 24 3 30 #" (" 0 0 14 3 12 #"beside/align" 0 0 24 3 1 #" " 0 0 19 3 10 #"\"baseline\"" 0 0 24 29 1 #"\n" 0 0 24 3 44 #" (" 0 0 14 3 4 #"text" 0 0 24 3 2 #" (" 0 0 14 3 9 #"substring" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 1 #" " 0 0 21 3 1 #"3" 0 0 24 3 2 #") " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 43 #" " 0 0 14 3 6 #"CURSOR" 0 0 24 29 1 #"\n" 0 0 24 3 44 #" (" 0 0 14 3 4 #"text" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"lo\"" 0 0 24 3 1 #" " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 29 #" " 0 0 14 3 3 #"BOX" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 9 #"draw-tbox" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 13 #"overlay/align" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"center\"" 0 0 24 29 1 #"\n" 0 0 24 3 30 #" (" 0 0 14 3 12 #"beside/align" 0 0 24 3 1 #" " 0 0 19 3 10 #"\"baseline\"" 0 0 24 3 1 #" " 0 0 14 3 6 #"CURSOR" 0 0 24 29 1 #"\n" 0 0 24 3 38 #" (" 0 0 14 3 4 #"text" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 29 #" " 0 0 14 3 3 #"BOX" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 9 #"draw-tbox" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 13 #"overlay/align" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"center\"" 0 0 24 29 1 #"\n" 0 0 24 3 30 #" (" 0 0 14 3 12 #"beside/align" 0 0 24 3 1 #" " 0 0 19 3 10 #"\"baseline\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"text" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"hello\"" 0 0 24 3 1 #" " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 37 #" " 0 0 14 3 6 #"CURSOR" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 29 #" " 0 0 14 3 3 #"BOX" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 9 #"draw-tbox" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 13 #"overlay/align" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"center\"" 0 0 24 29 1 #"\n" 0 0 24 3 30 #" (" 0 0 14 3 12 #"beside/align" 0 0 24 3 1 #" " 0 0 19 3 10 #"\"baseline\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"text" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 2 #") " 0 0 14 3 6 #"CURSOR" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 29 #" " 0 0 14 3 3 #"BOX" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 27 #"; draw : textbox? -> image?" 0 0 24 29 1 #"\n" 0 0 17 3 47 #"; Create an image corresponding to the textbox." 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 9 #"draw-tbox" 0 0 24 3 1 #" " 0 0 14 3 9 #"a-textbox" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 14 3 13 #"overlay/align" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"left\"" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"center\"" 0 0 24 29 1 #"\n" 0 0 24 3 18 #" (" 0 0 14 3 12 #"beside/align" 0 0 24 3 1 #" " 0 0 19 3 10 #"\"baseline\"" 0 0 24 29 1 #"\n" 0 0 24 3 32 #" (" 0 0 14 3 4 #"text" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-l" 0 0 24 3 1 #" " 0 0 14 3 9 #"a-textbox" 0 0 24 3 2 #") " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 31 #" " 0 0 14 3 6 #"CURSOR" 0 0 24 29 1 #"\n" 0 0 24 3 32 #" (" 0 0 14 3 4 #"text" 0 0 24 3 2 #" (" 0 0 14 3 6 #"tbox-r" 0 0 24 3 1 #" " 0 0 14 3 9 #"a-textbox" 0 0 24 3 2 #") " 0 0 14 3 6 #"FONT-H" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 17 #" " 0 0 14 3 3 #"BOX" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 36 #";-----------------------------------" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 7 #"require" 0 0 24 3 1 #" " 0 0 14 3 14 #"2htdp/universe" 0 0 24 3 5 #") " 0 0 17 3 63 #"; Note: usually we place any `require`s at the top of our file." 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 40 #"; The library function `big-bang` takes:" 0 0 24 29 1 #"\n" 0 0 17 3 48 #"; an initial object (here, an empty textbox)," 0 0 24 29 1 #"\n" 0 0 17 3 72 (19 72 ; a function to update the object on key-event (that is, a callback), ) 0 0 24 29 1 #"\n" 0 0 17 3 69 (20 69 ; and a function to draw the object on request (another callback). ) 0 0 24 29 1 #"\n" 0 0 17 3 58 #"; It then interfaces to the OS's keyboard and draw events," 0 0 24 29 1 #"\n" 0 0 17 3 45 #"; updating its notion of the current textbox." 0 0 24 29 1 #"\n" 0 0 17 3 73 (21 73 ; NOTE that we are doing this functionally: we never re-assign to fields, ) 0 0 24 29 1 #"\n" 0 0 17 3 79 (22 79 ; and we CAN have unit-tests for things usually thought of as GUI-inextricable. ) 0 0 24 29 1 #"\n" 0 0 17 3 60 #"; This is Model-View-Controller (done particularly cleanly)." 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 17 3 2 #"#;" 0 0 24 3 1 #"(" 0 0 15 3 8 #"big-bang" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"hi\"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"there\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" [" 0 0 14 3 7 #"on-draw" 0 0 24 3 1 #" " 0 0 14 3 9 #"draw-tbox" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" [" 0 0 14 3 6 #"on-key" 0 0 24 3 1 #" " 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #"])" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 63 #"; Another example of using `big-bang` (unrelated to textboxes):" 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 9 #"draw-ball" 0 0 24 3 1 #" " 0 0 14 3 1 #"n" 0 0 24 3 3 #") (" 0 0 14 3 7 #"overlay" 0 0 24 3 2 #" (" 0 0 14 3 6 #"circle" 0 0 24 3 2 #" (" 0 0 14 3 3 #"max" 0 0 24 3 1 #" " 0 0 21 3 1 #"0" 0 0 24 3 1 #" " 0 0 14 3 1 #"n" 0 0 24 3 2 #") " 0 0 21 3 1 #"'" 0 0 14 3 5 #"solid" 0 0 24 3 1 #" " 0 0 21 3 1 #"'" 0 0 14 3 4 #"blue" 0 0 24 3 3 #") (" 0 0 14 3 11 #"empty-scene" 0 0 24 3 1 #" " 0 0 21 3 3 #"200" 0 0 24 3 1 #" " 0 0 21 3 3 #"200" 0 0 24 3 3 #")))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 9 #"grow-ball" 0 0 24 3 1 #" " 0 0 14 3 1 #"n" 0 0 24 3 1 #" " 0 0 14 3 2 #"__" 0 0 24 3 3 #") (" 0 0 14 3 1 #"+" 0 0 24 3 1 #" " 0 0 14 3 1 #"n" 0 0 24 3 1 #" " 0 0 21 3 2 #"20" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 2 #"#;" 0 0 24 3 1 #"(" 0 0 15 3 8 #"big-bang" 0 0 24 3 1 #" " 0 0 21 3 2 #"20" 0 0 24 29 1 #"\n" 0 0 24 3 5 #" [" 0 0 14 3 7 #"on-draw" 0 0 24 3 1 #" " 0 0 14 3 9 #"draw-ball" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 5 #" [" 0 0 14 3 6 #"on-key" 0 0 24 3 1 #" " 0 0 14 3 9 #"grow-ball" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 5 #" [" 0 0 14 3 7 #"on-tick" 0 0 24 3 1 #" " 0 0 14 3 4 #"sub1" 0 0 24 3 2 #"])" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 63 #";;;;;;;;;;;;;;;;;;;;; easter-egg textbox ;;;;;;;;;;;;;;;;;;;;;;" 0 0 24 29 1 #"\n" 0 0 17 3 65 #";;; A textbox with a \"secret code\"; if you type in that code then" 0 0 24 29 1 #"\n" 0 0 17 3 50 #";;; the textbox is replaced with a hidden message." 0 0 24 29 1 #"\n" 0 0 17 3 3 #";;;" 0 0 24 29 1 #"\n" 0 0 17 3 60 #";;; >>>Pedagogical purpose: demo a struct-containing-struct," 0 0 24 29 1 #"\n" 0 0 17 3 58 #";;; and how the template guides us to appropriate helpers." 0 0 24 29 1 #"\n" 0 0 17 3 3 #";;;" 0 0 24 29 1 #"\n" 0 0 17 3 44 #";;; An \"eegg\" is a struct-containing-struct:" 0 0 24 29 1 #"\n" 0 0 17 3 62 #";;; a regular textbox, AND the secret-word AND how much of the" 0 0 24 29 1 #"\n" 0 0 17 3 49 #";;; secret-word has already been typed in so far." 0 0 24 29 1 #"\n" 0 0 17 3 3 #";;;" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 13 #"define-struct" 0 0 24 3 1 #" " 0 0 14 3 4 #"eegg" 0 0 24 3 2 #" (" 0 0 14 3 4 #"code" 0 0 24 3 1 #" " 0 0 14 3 6 #"so-far" 0 0 24 3 1 #" " 0 0 14 3 4 #"tbox" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 17 3 45 #"; make-eegg : string, string, textbox -> eegg" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ra\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ha\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"rad\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ha\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hax\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 71 (23 71 ; A "higher level" constructor, which initializes fields appropriately. ) 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 11 #"create-eegg" 0 0 24 3 1 #" " 0 0 14 3 4 #"code" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 14 3 4 #"code" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 3 #")))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 20 #"; Template for eegg:" 0 0 24 29 1 #"\n" 0 0 17 3 68 #"; NOTE that we have three fields, so our template will just pull out" 0 0 24 29 1 #"\n" 0 0 17 3 49 #"; those three fields (one of which is a textbox)," 0 0 24 29 1 #"\n" 0 0 17 3 46 #"; BUT NOT the fields-of-the-contained-textbox;" 0 0 24 29 1 #"\n" 0 0 17 3 62 #"; that is overreaching the \"one task, one function\" principle." 0 0 24 29 1 #"\n" 0 0 17 3 63 #"; Have another function to handle a textbox; this function only" 0 0 24 29 1 #"\n" 0 0 17 3 31 #"; handles the easter-egg logic." 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 13 #"func-for-eegg" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 14 3 3 #"..." 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-code" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 3 #") (" 0 0 14 3 11 #"eegg-so-far" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 3 #") (" 0 0 14 3 9 #"eegg-tbox" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 3 #")))" 0 0 24 29 1 #"\n" 0 0 17 3 55 #"; template DOES NOT include (tbox-l (eegg-tbox an-ee))," 0 0 24 29 1 #"\n" 0 0 17 3 59 #"; and our functions should likely not include these either." 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 14 3 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"heek" 0 0 24 3 2 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ra\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ha\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 0 0 24 3 3 #")) " 0 0 19 3 3 #"\"d\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"rad\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ha\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 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 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"heek" 0 0 24 3 2 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ra\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ha\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 0 0 24 3 3 #")) " 0 0 19 3 3 #"\"x\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 5 #"\"hax\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 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 12 #"check-expect" 0 0 24 3 2 #" (" 0 0 14 3 4 #"heek" 0 0 24 3 2 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"radd\"" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 4 #"\"ha\"" 0 0 24 3 1 #" " 0 0 19 3 6 #"\"choo\"" 0 0 24 3 3 #")) " 0 0 19 3 3 #"\"y\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 15 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 1 #" " 0 0 19 3 12 #"\"raddyraddy\"" 0 0 24 3 1 #" " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 14 3 14 #"THE-EASTER-EGG" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 1 #" " 0 0 14 3 14 #"THE-EASTER-EGG" 0 0 24 3 2 #" (" 0 0 14 3 4 #"tbox" 0 0 24 3 1 #" " 0 0 19 3 8 #"\"whoa, \"" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"woot!\"" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 32 #"; heek : eegg key-event? -> eegg" 0 0 24 29 1 #"\n" 0 0 17 3 40 #"; \"heek\" = \"handle easter-egg key-event\"" 0 0 24 29 1 #"\n" 0 0 17 3 1 #";" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 4 #"heek" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 1 #" " 0 0 14 3 3 #"key" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 15 3 4 #"cond" 0 0 24 3 3 #" [(" 0 0 14 3 8 #"string=?" 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-code" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 20 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 2 #" (" 0 0 14 3 11 #"eegg-so-far" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 2 #") " 0 0 14 3 3 #"key" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 9 #" " 0 0 17 3 35 #"; The easter egg has been unlocked!" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 2 #" (" 0 0 14 3 4 #"str*" 0 0 24 3 1 #" " 0 0 21 3 1 #"2" 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-code" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 3 #")) " 0 0 19 3 2 #"\"\"" 0 0 24 3 1 #" " 0 0 14 3 14 #"THE-EASTER-EGG" 0 0 24 3 2 #")]" 0 0 24 29 1 #"\n" 0 0 24 3 8 #" " 0 0 24 29 1 #"\n" 0 0 24 3 10 #" [(" 0 0 14 3 11 #"has-prefix?" 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-code" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 23 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 2 #" (" 0 0 14 3 11 #"eegg-so-far" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 2 #") " 0 0 14 3 3 #"key" 0 0 24 3 2 #"))" 0 0 24 29 1 #"\n" 0 0 24 3 9 #" " 0 0 17 3 35 #"; Making progress toward easter egg" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-code" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 21 #" (" 0 0 14 3 4 #"str+" 0 0 24 3 2 #" (" 0 0 14 3 11 #"eegg-so-far" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 2 #") " 0 0 14 3 3 #"key" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 21 #" (" 0 0 14 3 9 #"eegg-tbox" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 3 #"))]" 0 0 24 29 1 #"\n" 0 0 24 3 8 #" " 0 0 24 29 1 #"\n" 0 0 24 3 9 #" [" 0 0 14 3 4 #"else" 0 0 24 3 1 #" " 0 0 17 3 53 #"; Reset any progress, and delegate to tbox-handle-key" 0 0 24 29 1 #"\n" 0 0 24 3 10 #" (" 0 0 14 3 9 #"make-eegg" 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-code" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 20 #" " 0 0 19 3 2 #"\"\"" 0 0 24 29 1 #"\n" 0 0 24 3 21 #" (" 0 0 14 3 15 #"tbox-handle-key" 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-tbox" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 2 #") " 0 0 14 3 3 #"key" 0 0 24 3 5 #"))]))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" " 0 0 17 3 18 #"; BTW this is an e" 0 0 17 3 23 #"xample of the principle" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" " 0 0 17 3 20 #"; \"prefer delegation" 0 0 17 3 18 #" over inheritance\"" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 49 #"#| My first version -- w/o \"has-prefix?\" or a ren" 0 0 17 3 12 #"amed \"str+\"." 0 0 17 29 1 #"\n" 0 0 17 3 53 #" It's works, but is FAR too ugly (and rather long)." 0 0 17 29 1 #"\n" 0 0 17 29 1 #"\n" 0 0 17 3 24 #"(define (heek an-ee key)" 0 0 17 29 1 #"\n" 0 0 17 3 48 #" (cond [(key=? key (substring (eegg-code an-ee)" 0 0 17 29 1 #"\n" 0 0 17 3 59 #" (strlen (eegg-so-far an-ee))" 0 0 17 29 1 #"\n" 0 0 17 3 54 #" (add1 (strlen (eegg-so-" 0 0 17 3 14 #"far an-ee)))))" 0 0 17 29 1 #"\n" 0 0 17 3 42 #" (if (= (strlen (eegg-code an-ee))" 0 0 17 29 1 #"\n" 0 0 17 3 52 #" (add1 (strlen (eegg-so-far an-ee))))" 0 0 17 29 1 #"\n" 0 0 17 3 75 (24 75 (make-eegg (string-append (eegg-code an-ee) (eegg-code an-ee)) ) 0 0 17 29 1 #"\n" 0 0 17 3 26 #" \"\"" 0 0 17 29 1 #"\n" 0 0 17 3 42 #" (tbox \"whoa, \" \"wo" 0 0 17 3 6 #"ot!\"))" 0 0 17 29 1 #"\n" 0 0 17 3 41 #" (make-eegg (eegg-code an-ee)" 0 0 17 29 1 #"\n" 0 0 17 3 58 #" (string-append (eegg-so-far an-ee)" 0 0 17 29 1 #"\n" 0 0 17 3 67 #" (substring (eegg-code an-ee)" 0 0 17 29 1 #"\n" 0 0 17 3 78 (25 78 (strlen (eegg-so-far an-ee)) ) 0 0 17 29 1 #"\n" 0 0 17 3 1 #" " 0 0 17 3 86 (26 86 (add1 (strlen (eegg-so-far an-ee))))) ) 0 0 17 29 1 #"\n" 0 0 17 3 44 #" (eegg-tbox an-ee)))]" 0 0 17 29 1 #"\n" 0 0 17 3 42 #" [else (make-eegg (eegg-code an-ee)" 0 0 17 29 1 #"\n" 0 0 17 3 27 #" \"\"" 0 0 17 29 1 #"\n" 0 0 17 3 53 #" (tbox-handle-key (eegg-tbox " 0 0 17 3 15 #"an-ee) key))]))" 0 0 17 29 1 #"\n" 0 0 17 3 10 #" |#" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 6 #"define" 0 0 24 3 2 #" (" 0 0 14 3 9 #"draw-eegg" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" (" 0 0 14 3 9 #"draw-tbox" 0 0 24 3 2 #" (" 0 0 14 3 9 #"eegg-tbox" 0 0 24 3 1 #" " 0 0 14 3 5 #"an-ee" 0 0 24 3 3 #")))" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 3 1 #"(" 0 0 15 3 8 #"big-bang" 0 0 24 3 2 #" (" 0 0 14 3 11 #"create-eegg" 0 0 24 3 1 #" " 0 0 19 3 7 #"\"raddy\"" 0 0 24 3 1 #")" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" [" 0 0 14 3 7 #"on-draw" 0 0 24 3 1 #" " 0 0 14 3 9 #"draw-eegg" 0 0 24 3 1 #"]" 0 0 24 29 1 #"\n" 0 0 24 3 3 #" [" 0 0 14 3 6 #"on-key" 0 0 24 3 1 #" " 0 0 14 3 4 #"heek" 0 0 24 3 2 #"])" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 24 29 1 #"\n" 0 0 17 3 2 #"#|" 0 0 17 29 1 #"\n" 0 0 17 3 16 #"@author ibarland" 0 0 17 29 1 #"\n" 0 0 17 3 20 #"@version 2018-Sep-27" 0 0 17 29 1 #"\n" 0 0 17 29 1 #"\n" 0 0 17 3 47 #"@license: CC-BY 4.0 -- you are free to share an" 0 0 17 3 17 #"d adapt this file" 0 0 17 29 1 #"\n" 0 0 17 3 62 #"for any purpose, provided you include appropriate attribution." 0 0 17 29 1 #"\n" 0 0 17 3 49 #" https://creativecommons.org/licenses/by/4.0/ " 0 0 17 29 1 #"\n" 0 0 17 3 58 #" https://creativecommons.org/licenses/by/4.0/legalcode " 0 0 17 29 1 #"\n" 0 0 17 3 66 #"Including a link to the *original* file satisifies \"appropriate at" 0 0 17 3 11 #"tribution\"." 0 0 17 29 1 #"\n" 0 0 17 3 2 #"|#" 0 0 24 3 1 #" " 0 0