Advertisement
triclops200

Menu Test

Jul 16th, 2013
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 1.33 KB | None | 0 0
  1. #lang racket
  2.  
  3. (define (prompt st)
  4.   (display st)
  5.   (flush-output)
  6.   (read-line))
  7.  
  8. (define (nth n xs)
  9.   (car (drop xs  n )))
  10.  
  11. (define (create-menu . args)
  12.   (cons 'menu args))
  13.  
  14.  
  15. (define (add-to-menu item menu)
  16.   (cons 'menu (cons item (cdr menu))))
  17.  
  18. (define (runmenu menu)
  19.   (let loop [(xs (cdr menu)) (i 1)]
  20.     (if (null? xs)
  21.       (list)
  22.       (begin
  23.         (display i)
  24.         (display ". ")
  25.         (display (cadar xs))
  26.         (newline)
  27.         (loop (cdr xs) (+ 1 i)))))
  28.   (let [(selection (guard-get-num "> "))]
  29.     (if (integer? selection)
  30.       (if (and (<= selection (length menu)) (> selection 0))
  31.         (car (nth selection menu))
  32.         (begin
  33.           (display "Invalid Selection\n")
  34.           (runmenu menu)))
  35.       (begin
  36.         (display "Invalid Selection\n")
  37.         (runmenu menu)))))
  38.  
  39. (define (guard-get-num st)
  40.   (let [(n (string->number (prompt st)))]
  41.     (if (not (number? n))
  42.       (begin (display "Not a valid number.\n")
  43.              (guard-get-num st))
  44.       n)))
  45.  
  46. (define (gen-get-nums f)
  47.   (λ () (f
  48.            (guard-get-num "Number 1? ")
  49.            (guard-get-num "Number 2? "))))
  50.  
  51. (define (quit)
  52.   (display "Goodbye!\n")
  53.   (exit))
  54.  
  55. ((runmenu
  56.    (create-menu
  57.      (list (gen-get-nums +) "Add two numbers")
  58.      (list (gen-get-nums *) "Multiply two numbers")
  59.      (list (gen-get-nums /) "Divide two numbers")
  60.      (list (gen-get-nums -) "Subtract two numbers")
  61.      (list quit "Quit"))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement