(define (make-add-func x)
  (local ((define (x-adder y) (+ x y)))
    x-adder))

(define add5 (make-add-func 5))
(add5 10)
(add5 20)

(define (filter-creator rel-op)
  (local
   ((define (filter1 alon t)
	  (cond
	   [(empty? alon) empty]
	   [else
		(cond
		 [(rel-op (first alon) t) 
		  (cons (first alon)
				(filter1 (rest alon) t))]
		 [else
		  (filter1  (rest alon) t)])])))
   filter1))

;;
(define above (filter-creator > ))
 (above '(1 7 9 27 56 19) 20)

;;
(define below (filter-creator < ))
(below  '(1 7 9 27 56 19) 20)


;;
;; function that creates functions that access the nth element in a list
;;
(define (nth-creator n)
  (local
      ((define (f alist)
         (local
             ((define (f-helper l x)
                (cond
                  [(= 1 x) (first l)]
                  [ else (f-helper (rest l) (- x 1))])))
           (f-helper alist n))))
    f))

(define twelveth (nth-creator 12))
(twelveth '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16))

;; ==========================================================
;; GUI code (requires gui.ss teachpack)
;;

;; sample components (for screengrabs to put in slides)
; (create-window (list (list (make-text "Enter your name:"))))
; (create-window (list (list (make-message "Welcome to my gui"))))
; (create-window (list (list (make-button "Press Me" hide-window))))
; (create-window
;   (list
;     (list (make-message "Welcome to my gui")
;           (make-button "Press Me" hide-window))
;     (list (make-text "Enter your name:"))))



;; define some GUI items we will use
;; x and y are textboxes
(define x (make-text "X="))
(define y (make-text "Y="))

;; answer is a message (where we draw the answer)
(define answer (make-message "---"))

;; mult is called when the user clicks on the * button
(define (mult e)
  (draw-message 
   answer
   (number->string 
	(* (string->number (text-contents x))
	   (string->number (text-contents y))))))

;; add is called when the user clicks on the + button
(define (add e)
  (draw-message 
   answer
   (number->string 
	(+ (string->number (text-contents x))
	   (string->number (text-contents y))))))


;  (create-window
;   (list
;    (list  x)
;    (list  y)
;    (list  (make-button " * " mult)
;  		 (make-button " + " add))
;    (list  (make-message "Answer: ") answer)))

;; better solution - makes it easier to add new buttons that
;; apply some operator to x and y


(define (make-button-handler op)
  (local
   ((define (f e)
	  (draw-message
	   answer
	   (number->string
		(op (string->number (text-contents x))
		   (string->number (text-contents y)))))))
   f))


(create-window
 (list
  (list  x)
  (list  y)
  (list  (make-button " * " (make-button-handler *))
		 (make-button " + " (make-button-handler +))
		 (make-button " - " (make-button-handler -))
		 (make-button " / " (make-button-handler /)))
  (list  (make-message "Answer: ") answer)))