;; 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 separate variables

(define course
   (lambda (subj . other-data)
      (let (;; fields:  listing of private data
            (subject subj) ;; the subject or department name
            (number 0)     ;; the course number
            (credits 0)    ;; the number of credits
            (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
              (set! number (car other-data))
              (set! credits (cadr other-data))
              (set! title (caddr other-data))))
        (lambda (op . parameters)
           (cond 
              ;; Extractors
              ;; One extractor is defined to return each field in turn
              ((equal? op 'getSubject) subject)
              ((equal? op 'getNumber) number)
              ((equal? op 'getCredits) credits)
              ((equal? op 'getTitle) title)

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

              ;; Data conversion 
              ;; Return the fields in a string, in a nice format
              ((equal? op 'toString)
                  (string-append subject " " (number->string number) ":  "
                          title (string #\newline) 
                          "   Credits:  " (number->string 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)

