;; File:  /home/walker/public_html/courses/153.sp01/course.ss
;; Created:  April 3, 2001
;; Last Revised:  January 13, 2012

;; Descriptive information of a course
;; Intended as an example of a simple class
;; Local field data stored within a vector

(define course
   (lambda (subj . other-data)
      (let (;; content:  listing of private data as fields within a vector
            (content (make-vector 4))
            ;;define positions within content as data elements
            (subject 0)(number 1)(credits 2)(title 3))
        ;; initialize with default values
            (vector-set! content subject subj) ;; the subject or department name
            (vector-set! content number 0)     ;; the course number
            (vector-set! content credits 0)    ;; the number of credits
            (vector-set! content title "")    ;; the name of the course
        ;; build a course, based on given information
        (if (not (null? other-data))
            (begin ;; initialization gives course number, credits, title
              (vector-set! content number (car other-data))
              (vector-set! content credits (cadr other-data))
              (vector-set! content title (caddr other-data))))
        (lambda (op . parameters)
           (cond 
              ;; Extractors
              ;; One extractor is defined to return each field in turn
              ((equal? op 'getSubject) (vector-ref content subject))
              ((equal? op 'getNumber) (vector-ref content number))
              ((equal? op 'getCredits) (vector-ref content credits))
              ((equal? op 'getTitle) (vector-ref content title))

              ;; Modifiers
              ;; Specify course number and title
              ((equal? op 'setNumTitle) 
                  (vector-set! content number (car parameters))
                  (vector-set! content title (cadr parameters)))
              ((equal? op 'setCredits)
                  (vector-set! content credits (car parameters)))

              ;; Data conversion 
              ;; Return the data fields in a string, in a nice format
              ((equal? op 'toString)
                  (string-append (vector-ref content subject)
                                 " " 
                                 (number->string (vector-ref content number))
                                 ":  "
                                 (vector-ref content title)
                                 (string #\newline) 
                                 "   Credits:  " 
                                 (number->string (vector-ref content credits))
                                 (string #\newline)))
            )
         )
      )
   )
)


;; A sequences of tests follows:

(define myCourse (course "CSC"  207  4  "Algorithms and Object-Oriented Design"))
(define yourCourse (course "Math"))

;; test of initialization, toString, and extractor methods
(myCourse 'toString)
(yourCourse 'getSubject)
(yourCourse 'getNumber)
(yourCourse 'getTitle)
(yourCourse 'getCredits)

;; set fields
(yourCourse 'setNumTitle 131 "Calculus I")
(yourCourse 'setCredits 4)

;; print results of modification
(yourCourse 'toString)

