;; For review: (define-struct city (name nhbrs seen?)) ;; ;; A city is a ;; (make-city [symbol] [list-of-cities] [boolean]) ;; where seen? is to be used later, in path-finding. ; Initially no neighbors: (define nyc (make-city 'nyc empty false)) (define la (make-city 'la empty false)) (define slc (make-city 'slc empty false)) (define hou (make-city 'houston empty false)) (define nome (make-city 'nome empty false)) (define reno (make-city 'reno empty false)) (define cities (list nyc la slc hou nome reno)) (set-city-nhbrs! nyc (list la slc hou nyc)) (set-city-nhbrs! la (list reno slc nyc)) (set-city-nhbrs! hou (list nyc la)) (set-city-nhbrs! slc (list reno)) (set-city-nhbrs! reno (list slc)) ;; path: city, city --> list-of-city or false ;; Return false if no path, otherwise return ;; a path which includes both endpoints. ;; (define (path src dest) (cond [(eq? src dest) (list src)] [else (local {(define otherways (map ... ...)) (define viable-otherways (filter list? otherways))} (cond [(empty? viable-otherways) false] [else (cons src (first viable-otherways))])))])) (path3 slc nyc) = false (path3 nyc slc) = ; nyc -> la -> slc, printed in "shared" form. (error 'hello-class "Stay tuned for further examples...") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define speed-limit 75) (define scofflaw-margin 1.1) (define my-cruising-speed (* speed-limit scofflaw-margin)) my-cruising-speed = 82.5 ;(set! speed-limit 55) ; ;speed-limit = 55 ;my-cruising-speed = '??? (error 'hello-class "Stay tuned for further examples...") ;;;;;;;;;;;;;;;;;;;;; (define a (+ 2 3)) (define b a) (set! a 'volkswagen) b (define aa (make-posn 2 3)) (define bb aa) (set-posn-x! aa 99) bb Similarly, if you call translate-posn! (a function which changes the posn passed in) and pass in bb, both aa and bb can notice a change. But:
(define (silly x)
  (begin (set! x 17)    ; Not actually legal in Advanced, but if it were...
         'done))

a
(silly a)
a

aa
(silly aa)
aa
bb

(error 'hello-class "Stay tuned for further examples...")
;;;;;;;;;;;;;

(define seed 0)
;; return a pseudo-random int in [0,100)
(define (rand)
  (begin (set! seed (next-num seed))
         seed))

;; next-num: number --> number
;; Return the next number in an (ahem) random sequence.
;;
(define (next-num n)
  (remainder (+ 17 (* n 41)) 100))


(error 'hello-class "Stay tuned for further examples...")
;;;;;;;;;;;;;;;;;;;;;

(define directory empty)

(define-struct entry (name number))

;; add-entry!: symbol number --> list-of-entries
;; SIDE-EFFECT: add a new entry to direcotry.
;; We return (the updated) directory.
;;   (Not necessary to return this, since anybody can
;;   look up the placeholder "directory" at any time,
;;   to get that same info.)
;;
;;   However, a useful rule of thumb: when writing a function
;;   which modifies an object but doesn't otherwise return
;;   an interesting value, have it return the object being modified.
;;   This is often convenient in allowing you to pass that
;;   value to the next function, w/o having to use "begin".
;;
(define (add-entry! name number)
  (begin
    (set! directory (cons (make-entry name number) directory))
    directory))

;; lookup: symbol --> entry or false
;;
(define (lookup name)
  (lookup-helper name directory))

;; lookup-helper: symbol, list-of-entries --> entry or false
;;
(define (lookup-helper name entries)
  (cond [(empty? entries) false]
        [(cons?  entries) (if (symbol=? (entry-name (first entries)) name)
                              (first entries)
                              (lookup-helper name (rest entries)))]))



(error 'hello-class "Stay tuned for further examples...")
;;;;;;;;;;;;;;;;;;;;;;;;;

;; make-shopper-card: name --> (command, any --> any)
;;
(define make-shopper-card
  (local [(define most-recently-bought #f)]
    (lambda (name)
       (lambda (command some-item)
          (cond [(eq? command 'show-name) name]
                [(eq? command 'buy) (set! most-recently-bought some-item)]
                [(eq? command 'show-fave) most-recently-bought])))))