Either continue working on lab 5 or try the following problem on the web programming material.
Rewrite this program so that prompt-read, prompt-read-many, request-toppings, display-order, and order-pizza can be implemented as scripts. In other words, move all calls to these into script position.
Include the define-script macro in your file so you can test your solution.
(define abort #f)
(let/cc grab-abort
(set! abort grab-abort))
(define-syntax define-script
(syntax-rules ()
[(define-script (script-name arg ...) body)
(define (script-name arg ...)
(abort body))]))
(When you have finished this exercise, return to lab 5).
;;;;; some random helper functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (prompt-read promptstr)
(begin (printf "~a " promptstr) (read)))
(define (prompt-read-many plist) (map prompt-read plist))
(define (display-many strlist) (for-each printf strlist))
(define (sum alon) (foldl + 0 alon))
;;;;; the pizza helper functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; base-pizza-cost : symbol symbol -> number
;; compute cost of pizza without toppings
(define (base-pizza-cost style size)
(cond [(eq? style 'thin) (cond [(eq? size 'small) 8]
[(eq? size 'medium) 10]
[(eq? size 'large) 12])]
[(eq? style 'stuffed) (cond [(eq? size 'medium) 12]
[(eq? size 'large) 14])]))
;; topping-cost : list[symbol] -> number
;; calculates total charge for the given toppings
(define (topping-cost toppings)
(sum (map (lambda (topping)
(cond [(memq topping '(chicken sausage pepperoni)) 1.25]
[else .75])) toppings)))
;; request-toppings : -> list[symbol]
;; prompts user to enter any number of pizza toppings
(define (request-toppings)
(local ((define reply (prompt-read "Enter a topping [or none to quit]")))
(cond [(symbol=? reply 'none) empty]
[else (cons reply (request-toppings))])))
;; display-order : list[symbol] list[symbol] list[symbol] -> void
;; prints order summary from entered information
(define (display-order contact order toppings)
(let ([name (first contact)]
[address (second contact)]
[pickdel (third contact)]
[style (first order)]
[size (second order)])
(display-many (list (format "You ordered a ~a ~a pizza with ~a~n" size style toppings)
(cond [(eq? pickdel 'pickup) (format "You will pick up your pizza~n")]
[(eq? pickdel 'delivery)
(format "We will deliver your pizza to ~a~n" address)])
(format "Your total cost is $~a ~n"
(+ (base-pizza-cost style size)
(topping-cost toppings)))))))
;; order-pizza : -> void
;; runs the pizza program
(define (order-pizza)
(display-order (prompt-read-many (list "Enter your name:"
"Enter your address:"
"Pickup or Delivery?:"))
(prompt-read-many (list "Do you want thin or stuffed pizza?"
"What size do you want (small, medium, large)?"))
(request-toppings)))