UNB/ CS/ David Bremner/ teaching/ cs2613/ labs/ Lab 6

Before the Lab

Background


Review and Questions

Time
20 minutes
Activity
Group Discussion

Hash tables

Time
20 minutes
Activity
Individual

Although we've mainly focussed on lists, racket supports many other data structures. One very useful data structure is the hash table These support fast key based retrieval (and updating) of information.

#lang racket

(define ht (hash "apple" 'red "banana" 'yellow))

(module+ test
  (require rackunit)
  (check-equal? (hash-ref ht "apple") 'red))
(define ht2 (hash-set ht "coconut" 'brown))

(module+ test
  (check-equal? (hash-ref ht2 "coconut") 'brown)
  (check-exn exn:fail? (lambda () (hash-ref ht "coconut"))))
(define (census . lst)
  (define (helper lst acc-hash)
    (cond
      [(empty? lst) (hash->list acc-hash)]
      [else
       (let* ([key (first lst)]
              [current (hash-ref acc-hash key 0)])
         (helper (rest lst)                         ))]))
  (helper lst (hash)))

(module+ test
  (check-equal?
   (sort (census 1 2 3 1 2) #:key car <) '((1 . 2) (2 . 2) (3 . 1)))
  (check-equal?
   (sort (census "aardvark" "dingo" "buffalo" "buffalo" "bear") #:key car string<?)
   '(("aardvark" . 1) ("bear" . 1) ("buffalo" . 2) ("dingo" . 1))))

Explorer

Time
10 minutes
Activity
Demo
#lang racket
(require explorer)

(define a-list
  (list 1 (list 'foo "hello")
        (hash 'apple "red" 'sky "blue" 'violets "purple")))
(explore a-list)

Discussion

Time
10 minutes
Activity
Group discussion

JSON

Time
35 minutes
Activity
Individual

JSON is a common data interchage format. Most modern languages have some way to parse JSON, but it typically still requires some effort to extract the desired data.

(require explorer)
(require json)

(define (read-json-file file-name)
  (with-input-from-file file-name read-json))

(define (visualize-json-file file-name)
  (explore (read-json-file file-name)))
(module+ test
  (require rackunit)
  (check-equal? (collect-status "errors.json") '("403" "422" "500")))

If you have extra time

Complete the tail recursive version of collect-status. Note the use of sort in the test case, so we don't care about the order of our list.

(define (collect-status2 filename)
  (define (helper in-lst acc)
    (cond
      [(empty? in-lst) acc]
      [else (helper (rest in-lst)                )]))
  (helper                                  )

(module+ test
  (check-equal? (sort (collect-status "errors.json") string<?)
                (sort (collect-status2 "errors.json") string<?)))