;; Kathi Fisler ;; Powerpoint exercise ;; Stage 3 : dynamic content ;; January 31, 2003 ;;;;;;;;;;;;;;; THE INTERFACE LANGUAGE ;;;;;;;;;;;;;;;;;;;;;;; ;; print-string : string -> void ;; prints string and a newline to the screen (define (print-string str) (printf "~a~n" str)) ;; print-newline : -> void ;; prints a newline on the screen (define (print-newline) (printf "~n")) ;; print-unnumbered-strings : list[string] -> void ;; prints a list of strings to the screen, each prefixed with a - (define (print-unnumbered-strings strlist) (for-each (lambda (str) (printf "- ~a~n" str)) strlist)) ;; print-numbered-strings : list[string] -> void ;; prints a list of strings to the screen, each prefixed with ;; a number (in consecutive increasing order) (define (print-numbered-strings strlist label) (cond [(empty? strlist) void] [(cons? strlist) (begin (printf "~a. ~a~n" label (first strlist)) (print-numbered-strings (rest strlist) (+ 1 label)))])) ;; await-click : -> void ;; mimics a mouse click by waiting for the user to type a character (define (await-click) (read)) ;;;;;;;;;; INTERFACE HELPERS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; print-slide-title : string -> void ;; displays title of slide on screen (define (print-slide-title title-str) (print-string (string-append "Title: " title-str)) (print-newline)) ;; print-slide-body : slide-body -> void ;; displays contents of body on screen (define (print-slide-body body) (cond [(string? body) (print-string body)] [(pointlist? body) (cond [(pointlist-numbered? body) (print-numbered-strings (pointlist-points body) 1)] [else (print-unnumbered-strings (pointlist-points body))])])) ;; print-slide : slide -> void ;; displays contents of slide on screen (define (print-slide aslide) (begin (print-string "------------------------------") (print-slide-title (slide-title aslide)) (print-slide-body (slide-body aslide)) (print-string "------------------------------"))) ;; end-show : -> void ;; displays end of show message on screen (define (end-show) (print-string "End of show")) ;;;;;;;;;;;; THE DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; a slide is a (make-slide string slide-body) (define-struct slide (title body)) ;; a slide-body is either ;; - a string (paragraph), or ;; - a (make-pointlist list[string] boolean) (define-struct pointlist (points numbered?)) ;; A cmd is ;; - (make-display (-> slide)) ;; - (make-timecond (time->boolean) list[cmd] list[cmd]) (define-struct display (slide)) (define-struct timecond (time-limit within-time over-time)) ;; A talk is a list of sections (define-struct talk (cmds)) ;;;;;;;;;;;;;;; PROGRAMS ;;;;;;;;;;;;;;;;;;;;;;;;;;; (define talk2 (let ([make-intro-slide (lambda () (make-slide "Hand Evals in DrScheme" "Hand evaluation helps you learn how Scheme reduces programs to values"))] [make-arith-eg-slide (lambda () (make-slide (make-next-example-title) (make-pointlist (list "(+ (* 2 3) 6)" "(+ 6 6)" "12") false)))] [make-func-eg-slide (lambda () (make-slide (make-next-example-title) (make-pointlist (list "(define (foo x) (+ x 3))" "(* (foo 5) 4)" "(* (+ 5 3) 4)" "(* 8 4)" "32") false)))] [make-summary-slide (lambda () (make-slide "Summary: How to Hand Eval" (make-pointlist (list "Find the innermost expression" "Evaluate one step" "Repeat until have a value") true)))]) (make-talk (list (make-display make-intro-slide) (make-timecond (lambda (time-in-talk) (> 5 time-in-talk)) (list (make-display make-arith-eg-slide)) empty) (make-display make-func-eg-slide) (make-display make-summary-slide))))) ;;;;;;;;;;;;;;;; INTERPRETER ;;;;;;;;;;;;;;;;;;;;;;;;;; (define start-time 0) (define example-index 0) ;; elapsed-time : -> number ;; returns the elapsed seconds since the recorded start time (define (elapsed-time) (- (current-seconds) start-time)) ;; make-next-example-title : -> string ;; creates string from "Example" and the current example index ;; EFFECTS: increments example-index (define (make-next-example-title) (begin (set! example-index (+ 1 example-index)) (format "Example ~a" example-index))) ;; run-cmd : cmd -> void ;; executes the given command (define (run-cmd cmd) (cond [(display? cmd) (begin (print-slide ((display-slide cmd))) (await-click))] [(timecond? cmd) (cond [((timecond-time-limit cmd) (elapsed-time)) (run-cmdlist (timecond-within-time cmd))] [else (run-cmdlist (timecond-over-time cmd))])])) ;; run-cmdlist : list[cmd] -> void ;; executes every command in a list (define (run-cmdlist cmd-lst) (cond [(empty? cmd-lst) void] [(cons? cmd-lst) (begin (run-cmd (first cmd-lst))) (run-cmdlist (rest cmd-lst))])) ;; run-talk : talk -> void ;; executes the commands in a talk then displays end-of-show message (define (run-talk a-talk) (begin (set! example-index 0) (set! start-time (current-seconds)) (run-cmdlist (talk-cmds a-talk)) (end-show)))